这不是编码问题,而是正确处理和处理刷新令牌的概念性问题。
我有一个单页应用程序,在登录时会发出一个jwt令牌。令牌工作得很好。现在,我想将到期时间设置为较低的值,并使用刷新令牌刷新承载令牌。
问题是,应该在刷新令牌中存储哪些声明?在发出新令牌之前应该采取哪些步骤来验证刷新令牌?
例如,现在我的刷新令牌是一个存储过期的jwt,因此客户端知道刷新令牌何时到期,以及用户名声明,以便我知道刷新令牌与哪个用户相关联。
然后,当收到刷新令牌时:
这是正确的工作流程吗?我只是想确保我没有遗漏任何安全检查。
答案 0 :(得分:1)
如果您的应用程序是单页面应用程序,则不应使用长期刷新令牌,因为您无法安全地存储它们。
OAuth2为不同类型的客户端(which I've described here)定义了许多授权流程。刷新令牌仅适用于机密客户端(例如,生活在安全服务器上的Web应用程序)。
您的刷新令牌与您的访问令牌一样容易被盗,因为两者都是存储在客户端上的承载令牌。
某些OAuth库允许SPA或其他非机密客户端通过使用Cookie中的会话令牌与授权服务器的令牌端点进行通信来获取新的访问令牌。只要cookie有效,用户就可以获得新的访问令牌。之后,用户将需要重新进行身份验证。当然,cookie可以标记为安全和仅限http,这使得它们更难被窃取。
如果从使用访问令牌的同一服务端点发出JWT令牌,则可以让客户端在令牌请求中包含一个nonce,并将其作为声明包含在令牌中。客户端可以在Authorization标头中发送JWT,在自定义标头中发送nonce。您的令牌验证会再次对nonce进行哈希处理,并将其与JWT中的声明进行比较。这样,如果您的令牌被盗,则在没有nonce值的情况下使用更难。当然,在有针对性的攻击中,你的nonce也可能被盗。