安全性 - JWT和Oauth2(刷新令牌)

时间:2017-07-20 09:15:00

标签: security oauth oauth-2.0 cryptography jwt

我有一个角度客户端应用程序和.net web api服务器。 我试图了解如何使用令牌以最佳方式实现安全性。 我想了几个选项,我不知道哪一个是最好的,或者是否有更好的方法。

JWT有效期

1.使用凭据登录用户 - >服务器返回有效期的JWT(例如,从登录时间起60分钟)。服务器在60分钟内向服务器发出的每个有效请求都会返回一个新的JWT令牌,新的60分钟到期。如果用户在60分钟内未发送服务器请求,则必须再次登录。 此解决方案与会话非常相似。

Oauth2 - 我认为我没有正确理解这个协议,所以如果我说的不正确,我会道歉。

2.使用凭据登录用户 - > user获取refresh_token和access_token。 对于每个请求,客户端都附加access_token。如果服务器返回401(未授权),则客户端使用refresh_token创建新的access_token,并使用新令牌重新发送失败的请求。

对于我来说,这个流程中的问题是,我不知道我是否因为令牌无效或用户试图访问未经授权的资源而未经授权。

这使我得到了第三种解决方案。

3.使用凭据登录用户 - > user获取refresh_token,access_token和access_token_expiration。当用户想要向服务器创建请求时,他检查access_token是否已过期。如果过期,客户端将请求具有新过期的新access_token,然后才会对请求进行perfroms。

还有2个关于auth2的小问题:

1.为什么我有一个refresh_token和access_token?它们都存储在客户端本地存储中。为什么不总是使用refresh_token?对于服务器,有一个refresh_token和access_token是有意义的,因为refresh_token是安全的。

2.刷新令牌是否有到期日期? 如果是,我该如何创建新的刷新令牌? 如果它没有,那么它是否能够永久保持联系?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

选项3,使用凭据登录并获取访问令牌,刷新令牌和到期时间是常用方法。 例如:

{   
  "access_token": "eyJ0eXA....CqVJcc",  
  "token_type": "bearer",
  "expires_in": 3599,   
  "refresh_token": "AQAAAN...H2JXjIUAQ"
}

JWT访问令牌的到期时间也可以在有效负载字段exp中的令牌本身中以UNIX时间戳的形式找到:

{
  ...
  "exp": 1500547257,
  "nbf": 1500543657
   ...
}

使用该信息,您可以实现自己的机制来检查您的访问令牌是否仍然有效,并在必要时进行刷新。

刷新令牌通常也会过期。刷新令牌过期后,您需要使用凭据重新开始。

此外,您可以阅读此内容以获取有关该主题的更多信息:https://auth0.com/learn/refresh-tokens/

这是一个关于Angular中处理刷新令牌的教程: http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/