上下文:
多个设备可以使用相同的客户端凭据,因此它们共享令牌,当两个或更多设备尝试刷新令牌时,这可能导致争用情况。可以在标头中找到设备标识,因此自定义AuthenticationKeyGenerator
实现可以使用设备ID为每个设备生成令牌。设备ID可以作为附加参数存储在OAuth2Request.getExtensions()
中。
问题::正如我提到的,设备ID不是来自GET / POST参数,因此OAuth2Request.getRequestParameters()
中不存在设备ID,但可以在标头中找到它。但是OAuth2Request
是在DefaultOAuth2RequestFactory
中创建的(OAuth2RequestFactory
的实现),该访问者无法访问原始的http请求,无法从标题复制信息并将其添加到OAuth2Request.getExtensions()
>
捕获标头并将其存储在OAuth2Request.getExtensions()
中以供AuthenticationKeyGenerator
以后用作键的一部分的最佳方法是什么?
答案 0 :(得分:1)
我有一个AuthenticationKeyGenerator的类似实现,其中使用设备/用户代理使用Redis作为令牌存储为 auth_to_access 生成密钥。
下面是我在自定义AuthenticationKeyGenerator实现中如何捕获用户代理的代码段
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
String userAgent = request.getHeader("User-Agent");