如何让用户使用隐式流登录?

Posted

技术标签:

【中文标题】如何让用户使用隐式流登录?【英文标题】:How do I keep the user logged-in with Implicit flow? 【发布时间】:2018-05-17 20:16:14 【问题描述】:

据我了解,隐式流的最终结果是访问令牌,它允许客户端(在我的情况下为 JS SPA)向资源服务器 (API) 进行身份验证。

访问令牌通常只有效约 1 小时,然后过期 - 使其无用

那我的 JS 应用应该怎么做呢?将用户重定向回身份验证服务器是不现实的,因为用户必须每 1 小时重新输入一次凭据!

我也知道隐式流不支持刷新令牌,所以我也不能使用它们。

有没有办法保持用户的登录? Facebook 之类的东西如何让你无限期地保持登录?

【问题讨论】:

【参考方案1】:

澄清一下,您问的是OAuth 2.0 RFC 中详述的隐式流程,而不是更多处理用户身份验证的 OpenID Connect?

使用隐式流程,您确实必须定期调用授权端点以获取新令牌,但如果用户仍然登录到他们的身份提供者,则不应提示他们重新提交凭据,并且令牌将作为重定向 uri 中的哈希片段返回,无需用户交互。

您可以使用 AJAX 调用在反向通道上获取令牌,这样您的 SPA 应用用户体验就不会因需要获取新令牌而受到影响。

解决您在问题中强调的要点:

访问令牌通常只有效约 1 小时,然后过期 - 让它无用。

正确!

那么用户必须每 1 小时重新输入一次凭据!

不一定。

如果用户保持登录身份提供商(例如 facebook、google),则用户和该提供商之间将有一个浏览器 cookie。这实际上意味着身份提供者不需要用户重新输入凭据。授权服务器应该能够在无需交互的情况下向您返回令牌。

有没有办法持久化用户的登录信息?

您无法通过 SPA 控制它。这完全取决于用户保持登录到身份提供者。如果他们保持登录到 facebook、google(或您的应用使用的任何 IDP),那么您应该能够以非交互方式获取令牌。

This article 很好地解释了如何实现隐式流。

【讨论】:

OpenID Connect 进行身份验证和授权,这与 OpenID 不同。 您说的是用户是否保持登录身份提供者。但是他们自己如何保持登录状态?当然,这意味着他们正在使用一些长期存在的令牌(cookie)。但是,这是否会受到与 SPA 相同的安全影响,因为它不安全并且不能信任秘密?即这些服务如何根据自己的资源进行身份验证?【参考方案2】:

如果 OP 上的会话仍然处于活动状态(可能通过 cookie),那么 OpenID Connect 有一种机制来刷新(隐藏的)iframe 中的令牌:prompt=none

根据spec,发送此流时...

授权服务器不得显示任何身份验证或同意用户界面页面。如果最终用户尚未通过身份验证,或者客户没有预先配置对请求的声明的同意或不满足处理请求的其他条件,则会返回错误。错误代码通常是 login_required、interaction_required 或第 3.1.2.6 节中定义的其他代码。这可以用作检查现有身份验证和/或同意的方法。

prompt=none 也引用自 Session Management specification。

【讨论】:

那不是要求用户打开我的 JS 应用吗?如果我想在不打开应用的情况下保持会话怎么办? 另外,我可以通过 AJAX 而不是隐藏的 iframe 发出这个请求吗?

以上是关于如何让用户使用隐式流登录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SPA 中实现 OAuth 隐式流?

Spotify - 使用隐式流获取和更改用户数据

Open ID Connect 和本机公共应用程序......没有隐式流,没有混合流......那又如何?

logoutid 在身份 server4 的隐式流中不可用

用于 REST 应用程序的 Oauth SSO

我们真的需要在 OIDC 的隐式流中使用 id_token 吗?