OAuth 提供商重定向后如何给用户 JWT 令牌?

How to give user JWT token after OAuth provider redirect?

我正在实施 OAuth(使用 rauth)并将提供 JWT 令牌(使用 flask-jwt),javascript 前端(Angular1)。我已经为基于经典 cookie/session 的应用程序完成了它。有用。现在我想用 JWT 令牌来做。

如果我理解正确,用户将被重定向到提供商(例如 Google),登录帐户,我的服务器和提供商发挥作用,然后提供商将用户重定向回我的页面。现在我得到了用户配置文件,OAuth 部分就此结束。在正常会话中,您为用户提供 cookie 和其他用于设置会话的内容,然后将他重定向到主页。

这就是我卡住的地方。在提供者发回用户后如何给用户 JWT 令牌有什么好的做法吗?在重定向到主页时将其作为 cookie 提供给用户?放在页眉?据我所知,我需要 javascript 将令牌保存到 LocalStorage/SessionStorage.

一天结束时,用户将被重定向回我们的应用程序,现在需要呈现页面。我看到的唯一选择是 return JWT 作为 cookie 因为响应 headers 在 Javascript 中不可访问并且唯一的其他地方是将它嵌入 DOM 这会使其受到 CSRF 攻击。

当浏览器从 OAuth 提供商重定向时,它将只有一个访问代码,可以在服务器端交换访问令牌。但最佳实践表明您需要对该访问令牌保密(不要将其传回给浏览器)。

关于 JWT 在 cookie 中与 local/session 存储的争论很多,但在这个 use-case 中,除了使用 cookie 之外,我看不到任何其他选择。我看到的所有描述使用浏览器存储的 use-cases 都假设正在发出 XHR 请求以获取 JWT。但这不是 OAuth 流程中的一个选项,因为整个浏览器刚刚被重定向回我们的应用程序。

除了将 JWT 保存在 cookie 中以供将来 API 调用外,我看不到其他选项(对于 OAuth use-case)。但也许我遗漏了什么。

在将控制权传递给 Facebook 身份验证之前,您可以启动到您的 API 的套接字连接,然后可能会在您的应用程序中显示加载状态。之后让 Facebook 来做这件事。成功后,它会将数据发布到您的后端。您的后端会使用它之前创建的套接字来填充并将 JWT 传递给前端。这看起来工作量太大,如果操作不正确,可能会带来额外的错误。