akn*_*akn 5 architecture oauth oauth-2.0 jwt cloudfoundry-uaa
我想知道如何在主要浏览器默认禁用第三方cookie时,在2019年处理Oauth2隐式授权流程中的刷新令牌.
一些细节:
目前的设置:
UI SPA应用程序下 ui.example.com
身份提供者(UAA by CloudFoundry)下 uaa.api.example.com
场景:
当用户登录时,身份提供商将cookie设置为域的用户详细信息,uaa.api.example.com并在重定向的Location标头中返回JWT .
JWT存储在本地存储器中(for ui.example.com),但它仅在1h内有效,所以我想刷新它.
prompt=none发送到IDP授权端点的查询参数可以刷新(过程在Auth0指南中有详细描述(它不是UAA,但流程是相同的)
在每个20米隐藏的iframe中设置了src,uaa.api.exmaple.com/oauth/authorize?prompt=none创建了启动签名过程而无需用户提供其凭据的内容.当进程结束时,响应中返回的新JWT将再次存储在本地存储中.
问题:
当允许第三方cookie时,浏览器会将IDP的cookie添加到iframe发出的请求中,因此流程有效,我在响应中获得新令牌.
如果在浏览器的设置中禁用了第三方Cookie,则iframe无法访问自己的Cookie,因此login_required会返回错误,而不是新的JWT .无法通过iframe访问cookie使得令牌续订无法使用
题:
对于我的第三方Cookie问题,有什么解决方案吗?
如果没有,我可以用来登录和刷新令牌的Implicit Grant流量和SPA的替代品吗?
最后,我们决定采用不同的解决方案。当 JWT 生命周期结束时,我们会显示一个模式,通知会话已超时,并有 2 个按钮,一个用于注销,一个用于保持会话。当用户点击“保持会话”时,将打开新选项卡/弹出窗口,其中用户可以通过再次提供其凭据或在 IDP 会话仍处于活动状态时自动在 IDP 中重新进行身份验证。
所以流程是:
JWT lifetime ends-> 'keep session' in modal chose-> open new tab/popup-window with IDP login form-> successfully authenticated-> redirect back to app-> store token in browser's storage-> close popup-window/tab with window.close()->get new token from storage and use it in next calls
因为我们使用新的弹出窗口/选项卡来重新验证,所以第 3 方 cookie 不存在问题。
这也带来了一个巨大的优势。无论用户什么时候返回应用程序都不会丢失他的工作,因为模态将在那里等待。我认为,此外它还让我们满足重新验证可访问性成功标准(AAA 级)
成功标准 2.2.5 重新验证
当经过身份验证的会话过期时,用户可以在重新进行身份验证后继续活动而不会丢失数据。
| 归档时间: |
|
| 查看次数: |
589 次 |
| 最近记录: |