首页 文章

Spring boot:假设客户端休息呼叫不能使用oauth2,但可以在浏览器上运行

提问于
浏览
0

有2个微服务,一个休息服务是websocket服务 . Websocket服务假装客户端与其他服务进行通信 .

当从浏览器工具(例如邮递员)调用休息服务时,呼叫正常工作 . 我们只传递 Headers 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

    我认为你的令牌在拦截器中的硬编码不是一个好主意,你可以从 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

相关问题