通过nodejs app上的刷新和访问令牌了解身份验证流程

ElP*_*rru 7 security authentication node.js oauth-2.0 json-web-token

我知道有很多关于Oauth,Oauth2,JWT等的帖子.我读了很多,比以往任何时候都更困惑所以我正在寻找一些澄清.我将提出关于这个问题我的看法,我希望有人能告诉我,如果我的实现足够的安全还是什么,我做错了,如何改进它.

我正在构建一个API Rest服务器,用于向我的用户提供资源.我们假设它是一个银行应用程序,用户可以存款,取款和转账.

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

这就是我这样做的方式:

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

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

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

    • access token:

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

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

  4. access token不再有效时,auth服务器请求客户端提供a refresh token以便发布新的access token

    • 服务器refresh token从用户接收,解密它,将其与数据库中的一个进行比较,检查它是否已被撤销,并检查其唯一标识符.
    • 如果refresh token通过所有测试,则服务器access token向客户端发出新消息.
    • 如果refresh token一次测试失败,则服务器请求用户重新进行身份验证.

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

问题:

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

Mvd*_*vdD 1

OAuth2 让很多人感到困惑的原因是它根据使用的客户端类型使用不同的身份验证流程。

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

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

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