gpt4 book ai didi

spring-boot - 我需要获取身份验证 token 并将其设置在 header 中

转载 作者:行者123 更新时间:2023-12-02 20:14:58 24 4
gpt4 key购买 nike

我是 Spring boot 和响应式编程的新手。

我正在使用 spring webflux webclient 作为外部 api 服务。我需要获取身份验证 token 并将其设置在 header 中

WebClient.builder()
.baseUrl(baseUrl)
.filter((request, next) -> {
return next.exchange(request)
.flatMap((Function<ClientResponse, Mono<ClientResponse>>) clientResponse -> {
if (clientResponse.statusCode().value() == 401) {
return authenticate().map(token -> {
Token accessToken = authenticate().block();
ClientRequest retryRequest = ClientRequest.from(request).header("Authorisation", "Bearer " + accessToken.getAccessToken()).build();
return next.exchange(retryRequest);
}).
} else {
return Mono.just(clientResponse);
}
});
})
.defaultHeader("Authorization", "Bearer " + authToken.getAccessToken())
.build();


private Mono<Token> authenticate() {
MultiValueMap<String, String> params = new LinkedMultiValueMap();
params.add("client_id", clientId);
params.add("client_secret", clientSecret);
params.add("grant_type", "password");
params.add("username", username);
params.add("password", password);

WebClient client = WebClient.create(baseUrl);
return client
.post()
.uri(tokenUri)
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.syncBody(params)
.retrieve()
.bodyToMono(Token.class);
}

private static class Token {
@JsonProperty("access_token")
private String accessToken;

public String getAccessToken() { return accessToken; }
}

在应用程序启动期间,我将获取访问 token 并将其设置在 Webclient 构建器中。我创建了一个过滤器来处理 token 过期后的身份验证失败。但上面的代码会抛出错误,因为我使用了 block() ,它不应该在 react 器线程中使用。我还能怎样处理呢?我正在使用 oauth2 资源所有者密码授予流程。还有其他方法可以处理流量吗?

最佳答案

您好,我遇到了同样的问题(Adding a retry all requests of WebClient),看起来您已经重复使用了。但这里 flatmap 是你的 friend ,如果你有 Mono<Mono<T>> 你可以用 flatMap 压平它

builder.baseUrl("http://localhost:8080")
//sets the header before the exchange
.filter(((request, next) -> tokenProvider.getAccessToken()
.map(setBearerTokenInHeader(request))
.flatMap(next::exchange)))
//do the exchange
.filter((request, next) -> next.exchange(request)
.flatMap(clientResponse -> {
if (clientResponse.statusCode().value() == 401) {
//If unauthenicated try again
return authenticate()
.flatMap(Token::getAccessToken)
.map(setBearerTokenInHeader(request))
.flatMap(next::exchange);
} else {
return Mono.just(clientResponse);
}
}))
.build();

private Function<String, ClientRequest> setBearerTokenInHeader(ClientRequest request) {
return token -> ClientRequest.from(request).header("Bearer ", token).build();
}

关于spring-boot - 我需要获取身份验证 token 并将其设置在 header 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52614812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com