7

我知道已经有很多关于 Oauth、Oauth2、JWT 等的帖子。我已经阅读了很多,而且我比以往任何时候都更加困惑,所以我正在寻找一些澄清。我将提出我对这个主题的看法,我希望有人能告诉我我的实现是否足够安全,或者我做错了什么以及如何改进它。

我正在构建一个 API Rest 服务器来为我的用户提供我的资源。假设它是一个银行应用程序,用户可以在其中存款、取款和转账。

我正在为我的服务器使用 nodejs、hapijs、jsonwebtokens 和 bcrypt。我想实现两个令牌认证流程(Oauth2)。

这就是我这样做的方式:

  1. 用户通过提供一些凭据(用户名和密码)登录到身份验证服务器。

  2. 服务器验证用户的凭据,如果它们有效,它将授予用户访问权限并返回一个刷新令牌和一个访问令牌。

    • 这些令牌被保存到浏览器或移动设备的本地存储中。

    • access token: _

      • 被签名为 jsonwebtoken。
      • 包含发布日期、到期日期(5 分钟)、用户数据(id、用户名)。
    • refresh token: _

      • 被签名为 jsonwebtoken 并使用 bcrypt 加密。
      • 包含唯一标识符
      • 可能包含到期日期
      • 保存在数据库中。
  3. 只要access token是有效的,即它没有过期并且包含有效的用户数据,资源服务器就会为用户提供所请求的资源。

  4. access token不再有效时,身份验证服务器请求客户端提供一个refresh token以便发出一个新的access token

    • 服务器refresh token从用户那里接收,解密它,将它与数据库中的比较,检查它是否已被撤销,并检查它的唯一标识符。
    • 如果refresh token通过了所有测试,则服务器向客户端发出一个新access token的。
    • 如果refresh token未通过一项测试,则服务器请求用户重新认证。

注意:我试图避免使用 cookie。

问题:

  • 如果用户能偷一个access token,我猜它也能偷的refresh token。那么,我怎样才能使refresh token更安全呢?
  • 我对 Oauth2 流程的看法是否正确?
  • 我可以改进什么?
  • 我错过了什么吗?
4

1 回答 1

1

OAuth2 让很多人感到困惑的原因是它使用不同的身份验证流程,具体取决于使用的客户端类型。

OAuth2 区分两种客户端类型,机密或公开。除此之外,还有 2 个基于重定向的授权流(授权代码和隐式),旨在与浏览器或浏览器控件一起使用。

其他两个流(资源所有者密码和客户端凭据)旨在用于非浏览器应用程序(CLI、后台服务、受信任的移动客户端)。

我已经在此处的答案中更详细地描述了不同的流程以及何时使用它们。

于 2015-10-29T22:21:18.297 回答