我正在构建一组(一组)Web应用程序;后端有类似REST的API,前端将是一些REST JS应用程序,Android应用程序等;我正在努力想出一个SSO功能。
观察Oauth2 / OIDC似乎最好的方法是使用隐式流;但是,隐式流中的访问令牌(在oidc中)具有设定的到期时间。刷新令牌不是隐式流的一部分。
如何确保用户保持登录状态?即当访问令牌到期时,前端应用程序将尝试从auth服务器获取新的;应该要求用户名/密码。或者,它可以与前端(使用cookie)建立会话,但与刷新令牌有何不同?
在我看来,获取访问令牌,例如从Android应用程序意味着至少打开Web浏览器;取决于到期长度,这可能是经常的。这是正确的流程还是我错过了什么?
答案 0 :(得分:0)
您是对的,隐式授权类型不允许发布刷新令牌。 但是,不需要刷新令牌和访问令牌来了解用户是否已登录(访问令牌仅允许您访问受保护资源)。您必须使用授权响应中发出的ID令牌。
您可以通过发送带有查询参数prompt=none
的授权请求来验证用户是否仍然登录(请参阅3.1.2.1. Authentication Request部分)。我建议您使用同一部分中提到的id_token_hint
查询参数发送当前ID令牌:
以前由授权服务器颁发的ID令牌作为有关最终用户当前或过去经过身份验证的客户端会话的提示传递。如果由ID令牌识别的最终用户登录或由请求登录,则授权服务器返回肯定响应;否则,它应该返回一个错误,例如login_required。如果可能,当使用prompt = none时,应该存在id_token_hint
如果您收到错误(login_required
或interaction_required
),则该用户可能会被注销。
另一种方法是使用Session Management功能。但由于该规范尚未获得批准(草案27),因此可能会有所变更,但可能无法获得。但是,这是了解用户状态的一种非常简单的方法。