使用nodejs应用程序上的刷新和访问令牌了解身份validationstream程

我知道已经有很多关于Oauth,Oauth2,JWT等的post了。我看了很多,而且比以前更加困惑,所以我正在寻求一些解释。 我会提出我对这个问题的看法,希望有人能告诉我,如果我的实施是足够安全的,或者我做错了什么,以及如何改进。

我正在build立一个API Rest服务器,为我的用户提供资源。 假设这是一个银行应用程序,用户可以存款,取款和转账。

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

这是我这样做的方式:

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

  2. 服务器validation用户的凭证,如果它们是有效的,它将授予对用户的访问并返回刷新令牌和访问令牌。

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

    • access token

      • 被签名为jsonwebtoken。
      • 包含发布date,过期date(5分钟),用户数据(id,用户名)。
    • refresh token

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

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

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

注:我正在尝试避免使用Cookie。

问题:

  • 如果用户能够窃取access token ,我想它也可以窃取refresh token 。 那么,我怎样才能使refresh token更安全呢?
  • Oauth2stream程的观点是否正确?
  • 我可以改进什么?
  • 我错过了什么吗?

OAuth2对许多人来说是如此混乱的原因是因为它使用不同的authenticationstream程,这取决于使用何种types的客户端。

OAuth2区分两种客户types ,保密或公开的。 接下来,有2个基于redirect的授权stream(授权代码和隐式),这些授权stream旨在与浏览器或浏览器控件一起使用。

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

我在这里描述了不同的stream程,以及何时在这个答案中更详细地使用它们。