我已经使用Spring Boot,Spring Security,OAUTH2和JWT作为auth令牌实现了一个基本的身份验证系统。它工作正常,但我在想是否有意义将JWT存储在数据库中并检查每当有人使用它进行经过身份验证的请求时是否存在令牌?我特别想到以下场景:用户在移动设备中进行了身份验证,但是他们失去了它,因此他们想要取消对该设备的授权。然后,他们将能够发出一个操作,清除发给他们用户ID的令牌,并取消授权分配给他的所有令牌。还有其他方法吗?我认为这是错误的还是过于复杂的事情?
这是为了保护将从移动APP调用的REST API。
答案 0 :(得分:29)
您可以将JWT存储在数据库中,但是您会失去JWT的一些好处。 JWT为您提供了无需每次都检查数据库中令牌的优势,因为您只需使用加密技术来验证令牌是否合法。如果您必须在数据库中查找令牌,您可能只需使用不带有信息的不透明令牌,并让服务器和数据库为您提供信息。另一方面,如果您要在数据库中存储令牌,我认为JWT不是您的令牌类型的错误选择。如您所说,如果将令牌存储在数据库中,则撤销会有优势。这一切都取决于你想要达到的目标(更快的授权等,以及根据需要撤销的能力)。
如果需要,您仍然可以将JWT与OAuth2一起使用,而无需在数据库中存储令牌。 JWT具有可配置的到期时间,您可以设置它们 - 之后它们无效。访问令牌(无论是否为JWT)通常应该是短暂的安全性。如果担心某人的手机被盗并获得了获取令牌,我认为解决办法是让这些令牌快速到期(30分钟?)。如果您正在使用oauth2,那么阻止某人继续使用该应用程序的方法是让真正的所有者取消授权授权服务器上的移动应用客户端,以便不再提供访问令牌。
答案 1 :(得分:12)
您可以设置过期日期(适用于手机1周)。
为用户添加一些自定义字段refreshId
(您可以使用uuid)。
下一组在声明参数(“iat”)处发布。
将refreshId
存储到db并将其设置为claim参数。
然后,每次验证令牌时,都应检查令牌的“年龄”。如果超过一小时,您应该从数据库加载数据并检查refreshId
值并创建具有当前“iat”值的新令牌并将其发送到移动设备。当您需要停用令牌时,只需在db中为refreshId
生成新值。一小时后,所有令牌都将不正确,因此用户需要再次登录每台设备。如果需要,您可以制作更多自定义解决方案。