拥有2个微服务,一项休息服务是websocket服务。 Websocket服务让伪装的客户端与其余服务进行对话。
从浏览器工具(例如邮递员)调用休息服务时,该呼叫正常运行。我们仅传递标头Authorization
和值Bearer XXXXX
从没有拦截器的伪装呼叫时,我们会收到401:未经授权,这是正确的行为。
当将此拦截器添加到代码库中时,由于XXXXX当然是真正的令牌,因此我们会收到403
@Component
public class FeignOauth2Interceptor implements RequestInterceptor {
private static final String AUTHORIZATION_HEADER = "Authorization";
@Override
public void apply(RequestTemplate template) {
SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication authentication =
securityContext.getAuthentication();
template.header(AUTHORIZATION_HEADER, "Bearer XXXXX");
}
}
调用拦截器是因为添加后我们看到一个不同的错误代码,我们从401转到403。
我们在这里缺少什么?
预先感谢
答案 0 :(得分:0)
我认为在拦截器中对令牌进行硬编码不是一个好主意,您可以从 OAuth2AuthenticationDetails 获取令牌:
@Bean
public RequestInterceptor requestTokenBearerInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication == null) return;
OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
requestTemplate.header("Authorization", "Bearer " + details.getTokenValue());
}
};
}
此外,您可以使用 OAuth2FeignRequestInterceptor ,它从上下文中获取令牌并在需要时刷新自身。我认为,这是一个更好的解决方案。您可以在此处找到使用它的示例:https://stackoverflow.com/a/53454703/10697598