【问题标题】:SPA and refresh tokenSPA 和刷新令牌
【发布时间】:2018-02-27 04:12:55
【问题描述】:

我正在创建 Angular 单页应用程序,并且我想将 JWT(JSON Web 令牌)与 OAUTH 2.0 一起使用。我正在阅读最佳实践,发现 OAuth 0 文章应该对它有帮助 https://auth0.com/docs/api-auth/which-oauth-flow-to-use

我的应用程序应该能够登录用户并让他保持登录状态 60 天。我知道在浏览器中存储 60 天的访问令牌不是很安全,建议将其短暂保存。所以我想使用 Refresh Token 并将其存储在 HttpOnly Secure Cookie 中以不允许从客户端 Javascript 读取它,但是在这篇 auth0 文章中,他们说这是非常不安全的,SPA 不应该使用 Refresh 令牌,但他们没有描述为什么。

如果我的身份验证 API 代码交换端点在 JSON 响应中返回 access_token 但在 HttpOnly cookie 中返回 refresh_token 怎么办?这样我就不需要公开任何系统密钥,因为它们存储在身份验证后端 API 中。

有人可以提供更多信息并说明在 HttpOnly Secure cookie 中存储刷新令牌是否安全?

【问题讨论】:

    标签: oauth-2.0 single-page-application


    【解决方案1】:

    除了回答表单@ManishSingh,使用 OpenID Connect 你应该使用PKCE 不需要客户端密码。

    【讨论】:

      【解决方案2】:

      SPA 应用程序使用 OAuth2 隐式流,并且此流没有刷新令牌,因为公共客户端应用程序无法安全地存储系统密码。我建议实现 OpenID Connect 隐式流并将 JWT 令牌存储在本地存储中。此令牌更安全,不能被任何其他应用程序使用。您还可以加密令牌以保护敏感信息。如果您正在寻找更多信息,请访问简短的链接文章https://www.linkedin.com/pulse/microservices-security-openid-connect-manish-singh

      【讨论】:

      • 但是如果我的代码交换端点在 JSON 响应中返回访问令牌但在 HttpOnly cookie 中刷新令牌怎么办?我不需要公开任何系统密码,因为它存储在我的后端身份验证 API 中。
      • 您似乎正在使用 API 网关或类似方法在安全 cookie 响应中设置刷新令牌。从安全的角度来看,将 RT 存储在仅 http cookie 中是安全的。但我认为,如果您在 JSON 响应中仅使用 RT 而未使用任何其他安全性获取 AT,那么您的实现很容易受到 CSRF 攻击。
      • 我已阅读您提供的有关 OpenID 的文章,是的,我正在使用一些代理 API 将所有私钥存储在后端,谢谢 :)
      • @ManishSingh 你能解释一下为什么它会受到 CSRF 的攻击吗? CSRF 攻击无法查看响应。
      • 让我通过示例来描述,如果攻击者想要更改用户的电子邮件并且令牌存储在仅 HTTP 安全 cookie 中,流程将是 - 1. 用户登录 example.com 2. 用户访问攻击者的域 (hacking-application.com) 3. 攻击者欺骗用户的浏览器发送更改用户电子邮件的请求 (example.com) 4. 用户浏览器将带有令牌的身份验证 cookie 附加到此请求 5. 用户的电子邮件地址是改变了。
      猜你喜欢
      • 2020-05-08
      • 2018-12-27
      • 2015-08-17
      • 2020-09-11
      • 2017-11-20
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      相关资源
      最近更新 更多