使用具有特定 use-case 的 Spring 安全性获取访问令牌
Get access token using Spring Security with a specific use-case
use-case Spring Security 5 或其他我们不需要重新发明轮子的东西是否支持?关于如何(重新)更好地实现这一点的想法?
详情如下。第 3 方供应商提供的端点。我们从上游来源提取信息,然后转发给下游供应商。只需要 2 APIs:
- 请求访问令牌
- 保存信息
两者实际上都是通过网关调用的。我们已获得详细信息:
(一)
令牌请求需要基本身份验证(标准 header - 通常使用 base64 编码)。提供了网关用户和网关密码。
请求令牌的凭据已提供给我们:
- 授权类型 = 密码
- 消费者 ID
- 消费者秘密
- 帐户用户
- 账号密码
它以 访问令牌 和一些我们并不关心的其他细节进行响应,并且对我们的 use-case.
的价值为零
响应中没有expires_in信息。但我已经多次测试它,知道它确实会过期。不知道现在要多久,我可以做更多的测试来确定。
(乙)
保存请求需要不同的自定义header相同的网关用户/密码,然后在调用保存信息[=65=时的承载授权header ].
现在,上述所有实现都使用 RestTemplate。工作正常了。但是每次保存都需要一个令牌,这是昂贵的。在编写任何缓存或其他一些逻辑以在发出另一个令牌请求之前等待 XY 分钟之前,我将不胜感激可能已经通过 Spring-specific 库处理的任何其他选项,或者就如何处理这种情况提供进一步建议。
如果这不是问这个问题的正确位置,或者之前已经有人问过,我们深表歉意。一直在寻找类似的 use-case,但似乎找不到。
谢谢。
- 尝试任一选项
您可以使用存储您的访问令牌的 OAuth2ClientContext。
final OAuth2RestTemplate restTemplate=new OAuth2RestTemplate(resourceDetails, clientContext);
您可以创建会话并在其中存储您的令牌和用户详细信息。
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(user, null,null);
SecurityContextHolder.getContext().setAuthentication(authToken);
- 从选项 1 或选项 2 中,您可以在过滤器中为每个请求获取现有令牌,例如PRE_AUTH_FILTER
- 然后检查令牌是否过期 - 如果是则请求新令牌或调用刷新令牌
检查下面的 Oauth2 expires_in :-
https://www.rfc-editor.org/rfc/rfc6749?
use-case Spring Security 5 或其他我们不需要重新发明轮子的东西是否支持?关于如何(重新)更好地实现这一点的想法?
详情如下。第 3 方供应商提供的端点。我们从上游来源提取信息,然后转发给下游供应商。只需要 2 APIs:
- 请求访问令牌
- 保存信息
两者实际上都是通过网关调用的。我们已获得详细信息:
(一) 令牌请求需要基本身份验证(标准 header - 通常使用 base64 编码)。提供了网关用户和网关密码。
请求令牌的凭据已提供给我们:
- 授权类型 = 密码
- 消费者 ID
- 消费者秘密
- 帐户用户
- 账号密码
它以 访问令牌 和一些我们并不关心的其他细节进行响应,并且对我们的 use-case.
的价值为零响应中没有expires_in信息。但我已经多次测试它,知道它确实会过期。不知道现在要多久,我可以做更多的测试来确定。
(乙) 保存请求需要不同的自定义header相同的网关用户/密码,然后在调用保存信息[=65=时的承载授权header ].
现在,上述所有实现都使用 RestTemplate。工作正常了。但是每次保存都需要一个令牌,这是昂贵的。在编写任何缓存或其他一些逻辑以在发出另一个令牌请求之前等待 XY 分钟之前,我将不胜感激可能已经通过 Spring-specific 库处理的任何其他选项,或者就如何处理这种情况提供进一步建议。
如果这不是问这个问题的正确位置,或者之前已经有人问过,我们深表歉意。一直在寻找类似的 use-case,但似乎找不到。
谢谢。
- 尝试任一选项
您可以使用存储您的访问令牌的 OAuth2ClientContext。
final OAuth2RestTemplate restTemplate=new OAuth2RestTemplate(resourceDetails, clientContext);
您可以创建会话并在其中存储您的令牌和用户详细信息。
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(user, null,null);
SecurityContextHolder.getContext().setAuthentication(authToken);
- 从选项 1 或选项 2 中,您可以在过滤器中为每个请求获取现有令牌,例如PRE_AUTH_FILTER
- 然后检查令牌是否过期 - 如果是则请求新令牌或调用刷新令牌
检查下面的 Oauth2 expires_in :- https://www.rfc-editor.org/rfc/rfc6749?