我一直在开发与Android,iOS,Web浏览器等跨平台客户端通信的RESTful API服务器。
当用户通过用户名和密码成功登录时,该服务器将发出访问令牌(JWT,5分钟)和刷新令牌(GUID,20天)。
当我们开发与服务器通信的Android客户端应用程序时,我们只能将此令牌存储在移动设备中,我认为就安全性而言(使用SharedPreferences
不会有问题。
但是对于Web浏览器,(React App)我不得不解决在哪里存储这些令牌。最后,我决定使用HttpOnly Cookie
,因为我可以轻松管理CSRF攻击而不是XSS。
很快,我怀疑这是一个典型的设计。例如,Web浏览器用户无法随时注销。所以我决定在React应用程序和RESTful API服务器之间更改包装器服务器(Node.js)。
在我的第二个设计中,React App和包装服务器使用passport.js
进行身份验证会话cookie模型。当包装程序识别出请求已通过身份验证时,包装程序将发出短期访问令牌(1分钟JWT),并通过将刚发布的访问令牌插入发送到RESTful API服务器的标头中来重新组织请求。
这是合理的过程吗?预先谢谢你。
答案 0 :(得分:0)
您可以通过完全删除JWT访问令牌来简化解决方案。刷新令牌可以用作会话ID。每次客户端向服务器发出API调用时,都会在HTTP标头中发送会话ID,因此您可以检查请求是否合法。
您可以使用具有较短到期时间的JWT令牌的方法,但这会给您的系统带来一些复杂性。我认为这种方法最适合于具有身份验证服务和资源所有者服务的系统。因此,客户端将请求对身份验证服务的访问令牌,并使用该令牌与资源所有者服务进行通信。然后,资源所有者可以仅通过检查签名是否与身份验证服务的签名相匹配来检查访问令牌的有效性。
希望这对您有所帮助,如果我缺少某些东西,请告诉我。