用于 REST 应用程序的 Oauth SSO
Posted
技术标签:
【中文标题】用于 REST 应用程序的 Oauth SSO【英文标题】:Oauth SSO for REST applications 【发布时间】:2016-12-31 12:19:54 【问题描述】:我正在构建一个(一组)Web 应用程序;后端有类似 REST 的 API,前端将是一些 REST JS 应用程序、android 应用程序等;我正在尝试提供 SSO 功能。
查看 Oauth2/OIDC 似乎最好的方法是使用隐式流;但是,隐式流(在 oidc 中)中的访问令牌具有设置的过期时间。刷新令牌不是隐式流的一部分。
如何确保用户保持登录状态? IE。当访问令牌过期时,前端应用程序将尝试从身份验证服务器获取一个新的;那应该要求输入用户名/密码。或者,它可以与前端建立会话(使用 cookie),但这与刷新令牌有何不同?
在我看来,获取访问令牌,例如从 android 应用程序意味着至少打开网络浏览器;根据到期时长,这可能很常见。这是正确的流程还是我错过了什么?
【问题讨论】:
【参考方案1】:您是对的,隐式授权类型不允许发布刷新令牌。 但是,刷新令牌和访问令牌不需要知道用户是否登录(访问令牌只允许您访问受保护的资源)。您必须使用授权响应中发布的 ID Token。
您可以通过发送带有查询参数prompt=none
的授权请求来验证用户是否仍然登录(参见3.1.2.1. Authentication Request 部分)。我建议您使用同一部分中提到的id_token_hint
查询参数发送当前 ID 令牌:
之前由授权服务器发布的 ID 令牌被传递作为有关最终用户当前或过去与客户端的身份验证会话的提示。如果 ID Token 标识的 End-User 已登录或被请求登录,则 Authorization Server 返回肯定响应;否则,它应该返回一个错误,例如 login_required。如果可能,在使用 prompt=none 时应该出现 id_token_hint
如果您收到错误消息(login_required
或 interaction_required
),则用户可能会被注销。
另一种方法是使用Session Management 功能。但由于该规范尚未获得批准(草案 27),它可能会发生变化并且可能无法使用。但是,这是了解用户状态的一种非常简单的方法。
【讨论】:
以上是关于用于 REST 应用程序的 Oauth SSO的主要内容,如果未能解决你的问题,请参考以下文章
使用 openid connect 作为 SSO 用于多个应用程序