用于 JWT 令牌验证的 Feign 客户端自定义拦截器

Pab*_*yor 3 spring-cloud-feign feign

几天以来,我是春天的新手,假装和探索。我能够向我们受保护的资源(用户名/密码)发出身份验证请求,并在后续请求标头中使用身份验证服务返回的 JWT 令牌。但是,我只想在令牌过期时使用相同的凭据调用 auth 服务。Spring 云有 OAuth2FeignRequestInterceptor,它正在做完全相同的事情,但使用客户端 ID 和密钥。

任何用于处理由用户名和密码生成的令牌的自定义拦截器?

Kev*_*vis 5

如果您的 JWT 令牌提供程序符合 OAuth 2.0,您可以OAuth2FeignRequestInterceptor使用OAuth2ProtectedResourceDetails对象配置, 。此对象是所有 OAuth 2.0 授权类型信息的基类。在您的情况下,我建议ResourceOwnerPasswordResourceDetails改用。这将允许您使用用户名和密码配置拦截器。

@Configuration
public class OAuth2RequestInterceptorConfiguration {

    @Bean
    public OAuth2FeignRequestInterceptor requestInterceptor() {
        OAuth2ClientContext clientContext = new DefaultOAuth2ClientContext();
        OAuth2ProtectedResourceDetails resourceDetails =
            new ResourceOwnerPasswordResourceDetails();
        resourceDetails.setUsername("username");
        resourceDetails.setPassword("password");
        return new OAuth2FeignRequestInterceptor(clientContext, resourceDetails);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于其他情况,您将需要创建自己的 RequestInterceptor

public class MyRequestInterceptor implements RequestInterceptor {

    private String jwt;
    private LocalDateTime expirationDate;

    @Override
    public void apply(RequestTemplate requestTemplate) {
        /* validate and refresh your token, this sample is not thread safe */
        if (LocalDateTime.now().isAfter(expirationDate)) {
            requestToken();
        }

        /* use the token */
        requestTemplate.header("Authorization: Bearer " + this.jwt);
    }
}
Run Code Online (Sandbox Code Playgroud)