我正在使用 Thinktecture AuthorizationServer (AS),它运行良好。
我想编写一个可以直接调用 WebAPI 的原生 javascript 单页应用程序,但是隐式流不提供刷新令牌。
如果进行 AJAX 调用,如果令牌已过期,API 将发送重定向到登录页面,因为数据使用动态弹出窗口,这将中断用户。
Facebook 或 Stackoverflow 如何做到这一点,并且仍然允许页面上运行的 javascript 调用 API?
建议的解决方案
以下场景听起来是否合理(假设这可以使用 iframe 完成):
我的 SPA 将我定向到 AS,我通过隐式流获得了一个令牌。在 AS 我单击允许Read data
范围,然后单击Remember decision
,然后单击Allow
按钮。
由于我点击Remember decision
了按钮,每当我点击 AS 获取令牌时,都会自动传回一个新令牌,而无需我登录(我可以看到 FedAuth cookie 记住了我的决定,并相信这使它能够正常工作)。
使用我的 SPA(不受信任的应用程序),我没有刷新令牌,只有访问令牌。所以我改为:
- 确保用户已登录并单击记住决定(否则 iframe 将无法工作)
- 调用 WebAPI,如果 401 响应尝试通过以下步骤获取新令牌...
- 在页面上有一个隐藏的 iframe,我将设置 URL 以从授权服务器获取新的访问令牌。
- 从 iframe 的哈希片段中获取新令牌,然后将其存储在 SPA 中并用于所有未来的 WebAPI 请求。
我想如果 FedAuth cookie 被盗,我仍然会遇到麻烦。
上述情况的任何标准或推荐方式?