如何让用户使用Implicit流程登录?

时间:2017-12-04 11:16:02

标签: authentication oauth-2.0 authorization jwt openid-connect

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

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

我的JS应用程序应该做什么?将用户重定向回auth服务器是不现实的,因为然后用户必须每隔1小时重新输入他们的凭据!

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

有没有办法坚持用户的登录? Facebook这样的东西会让您无限期地登录?

2 个答案:

答案 0 :(得分:1)

为了澄清一下,您问的是OAuth 2.0 RFC而不是OpenID Connect中详细介绍的隐式流程,它更多地涉及用户的身份验证?

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

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

要解决您在问题中突出显示的要点:

  

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

正确!

  

然后用户必须每1小时重新输入一次凭证!

不一定。

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

  

有没有办法坚持用户登录?

您无法通过SPA控制它。它完全依赖于用户保持登录身份提供者。如果他们保持登录Facebook,谷歌(或你的应用程序使用的任何IDP),那么你应该能够以非交互方式获得令牌。

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

答案 1 :(得分:0)

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

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

  

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

prompt=none也来自Session Management specification