首页 文章

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

提问于
浏览
1

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

JWT有效期

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

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

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

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

这使我得到了第三个解决方案 .

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

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

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

2.刷新令牌是否有到期日期?如果是,我该如何创建新的刷新令牌?如果没有,是不是有点不能保持永远保持联系的能力?

非常感谢您的帮助

1 回答

  • 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/

相关问题