春季启动:假客户端休息呼叫不适用于oauth2,但在浏览器上有效

时间:2018-12-09 20:39:34

标签: spring spring-boot oauth-2.0 access-denied feign

拥有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。

我们在这里缺少什么?

预先感谢

1 个答案:

答案 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

相关问题