我正在使用 Thinktecture AuthorizationServer (AS),它运行良好。
我想编写一个本机 javascript 单页应用程序,它可以直接调用 WebAPI,但是隐式流不提供刷新令牌。
如果进行 AJAX 调用,如果令牌已过期,API 将发送重定向到登录页面,因为数据使用动态弹出窗口,这将中断用户。
Facebook 或 Stackoverflow 如何做到这一点,同时仍然允许页面上运行的 javascript 调用 API?
建议的解决方案
下面的场景听起来是否合理(假设这可以通过 iframe 完成):
我的 SPA 将我引导至 AS,然后我通过隐式流获取令牌。在 AS 中我单击允许Read data
范围,然后单击Remember decision
, then Allow
button.
既然我点击了Remember decision
按钮,每当我点击 AS 获取令牌时,都会自动传回一个新令牌,而无需我登录(我可以看到 FedAuth cookie 正在记住我的决定,并相信这使其能够正常工作)。
对于我的 SPA(不受信任的应用程序),我没有刷新令牌,只有访问令牌。所以我:
- 确保用户已登录并单击“记住决定”(否则 iframe 将无法工作)
- 调用 WebAPI,如果 401 响应尝试通过以下步骤获取新令牌...
- 页面上有一个隐藏的 iframe,我将设置 URL 以从授权服务器获取新的访问令牌。
- 从 iframe 的哈希片段获取新令牌,然后将其存储在 SPA 中并用于将来的所有 WebAPI 请求。
我想如果 FedAuth cookie 被盗的话我仍然会遇到麻烦。
对于上述场景有什么标准或推荐的方法吗?
我了解您的问题是,当访问令牌过期时,用户将通过重定向到授权服务器的登录页面而遇到中断。但我认为你不能而且不应该解决这个问题,至少在使用隐式授权时是这样。
我相信你已经知道了隐性授予 https://www.rfc-editor.org/rfc/rfc6749应该由无法保密其凭证的消费者使用。因此,授权服务器颁发的访问令牌应该具有有限的 ttl。例如,谷歌使他们的访问令牌无效3600 sec https://developers.google.com/identity/protocols/OAuth2UserAgent#handlingtheresponse。当然,您可以增加 ttl,但它永远不应该成为长期存在的令牌。
另外需要注意的是,在我看来,用户中断非常小,即如果实施正确,用户只需向授权服务器进行一次身份验证。完成此操作后(例如,第一次授权应用程序访问用户控制的任何资源时),将建立一个会话(基于 cookie 或基于令牌),并且当消费者的访问令牌(使用隐式授予的 Web 应用程序)过期后,将通知用户令牌已过期,需要向授权服务器重新进行身份验证。但由于会话已经建立,用户将立即重定向回 Web 应用程序。
然而,如果这不是您想要的,我认为您应该考虑使用授权代码授予,而不是使用 iframe 做复杂的事情。
在这种情况下,您需要一个服务器端 Web 应用程序,因为这样您就可以保密您的凭据并使用刷新令牌。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)