使用nodejs应用程序上的刷新和访问令牌了解身份validationstream程
我知道已经有很多关于Oauth,Oauth2,JWT等的post了。我看了很多,而且比以前更加困惑,所以我正在寻求一些解释。 我会提出我对这个问题的看法,希望有人能告诉我,如果我的实施是足够安全的,或者我做错了什么,以及如何改进。
我正在build立一个API Rest服务器,为我的用户提供资源。 假设这是一个银行应用程序,用户可以存款,取款和转账。
我正在使用nodejs,hapijs,jsonwebtokens和bcrypt为我的服务器。 我想实现两个令牌authenticationstream程(Oauth2)。
这是我这样做的方式:
-
用户通过提供一些凭据(用户名和密码)login到auth服务器。
-
服务器validation用户的凭证,如果它们是有效的,它将授予对用户的访问并返回刷新令牌和访问令牌。
-
这些令牌被保存到浏览器或移动设备的本地存储器中。
-
access token
:- 被签名为jsonwebtoken。
- 包含发布date,过期date(5分钟),用户数据(id,用户名)。
-
refresh token
:- 被签名为jsonwebtoken并用bcryptencryption。
- 包含一个唯一标识符
- 可能包含到期date
- 保存在数据库中。
-
-
只要
access token
有效,即没有过期并且包含有效的用户数据,资源服务器就为用户提供所请求的资源。 -
当
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程,以及何时在这个答案中更详细地使用它们。