Add support for a bearer token supplier to OAuth based RestTemplate clients. Fixes #19000 (#19002)

This commit is contained in:
GregDThomas 2024-06-24 06:37:04 +01:00 committed by GitHub
parent c0be6ba9df
commit 0368f4e031
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 302 additions and 42 deletions

View File

@ -331,9 +331,18 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
* @param accessToken Access token
*/
public void setAccessToken(String accessToken) {
setAccessToken(() -> accessToken);
}
/**
* Helper method to set the supplier of access tokens for OAuth2 authentication.
*
* @param tokenSupplier The supplier of bearer tokens
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
for (Authentication auth : authentications.values()) {
if (auth instanceof OAuth) {
((OAuth) auth).setAccessToken(accessToken);
((OAuth) auth).setAccessToken(tokenSupplier);
return;
}
}

View File

@ -1,24 +1,48 @@
package {{invokerPackage}}.auth;
import java.util.Optional;
import java.util.function.Supplier;
import org.springframework.http.HttpHeaders;
import org.springframework.util.MultiValueMap;
/**
* Provides support for RFC 6750 - Bearer Token usage for OAUTH 2.0 Authorization.
*/
{{>generatedAnnotation}}
public class OAuth implements Authentication {
private String accessToken;
private Supplier<String> tokenSupplier;
/**
* Returns the bearer token used for Authorization.
*
* @return The bearer token
*/
public String getAccessToken() {
return accessToken;
return tokenSupplier.get();
}
/**
* Sets the bearer access token used for Authorization.
*
* @param bearerToken The bearer token to send in the Authorization header
*/
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
setAccessToken(() -> accessToken);
}
/**
* Sets the supplier of bearer tokens used for Authorization.
*
* @param tokenSupplier The supplier of bearer tokens to send in the Authorization header
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
this.tokenSupplier = tokenSupplier;
}
@Override
public void applyToParams(MultiValueMap<String, String> queryParams, HttpHeaders headerParams, MultiValueMap<String, String> cookieParams) {
if (accessToken != null) {
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
}
Optional.ofNullable(tokenSupplier).map(Supplier::get).ifPresent(accessToken ->
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)
);
}
}

View File

@ -2889,4 +2889,38 @@ public class JavaClientCodegenTest {
.containsWithNameAndAttributes("XmlElement", Map.of("name", "\"item\""))
.containsWithNameAndAttributes("XmlElementWrapper", Map.of("name", "\"activities-array\""));
}
@Test
public void shouldGenerateOAuthTokenSuppliers() {
final Map<String, File> files = generateFromContract(
"src/test/resources/3_0/java/oauth.yaml",
JavaClientCodegen.RESTTEMPLATE
);
final JavaFileAssert apiClient = JavaFileAssert.assertThat(files.get("ApiClient.java"))
.printFileContent();
apiClient
.assertMethod("setAccessToken", "String")
.bodyContainsLines("setAccessToken(() -> accessToken);");
apiClient
.assertMethod("setAccessToken", "Supplier<String>")
.bodyContainsLines("((OAuth) auth).setAccessToken(tokenSupplier);");
final JavaFileAssert oAuth = JavaFileAssert.assertThat(files.get("OAuth.java"))
.printFileContent();
oAuth
.assertMethod("setAccessToken", "String")
.bodyContainsLines("setAccessToken(() -> accessToken);");
oAuth
.assertMethod("setAccessToken", "Supplier<String>")
.bodyContainsLines("this.tokenSupplier = tokenSupplier;");
oAuth
.assertMethod("applyToParams")
.bodyContainsLines("Optional.ofNullable(tokenSupplier).map(Supplier::get).ifPresent(accessToken ->")
.bodyContainsLines("headerParams.add(HttpHeaders.AUTHORIZATION, \"Bearer \" + accessToken)");
}
}

View File

@ -0,0 +1,28 @@
openapi: 3.0.3
info:
title: Test OAuth code generation
description: Tests OAuth code generation
version: 1.0.0
servers:
- url: http://localhost:8080
paths:
/api/something:
get:
responses:
204:
description: Success!
components:
securitySchemes:
oAuth:
type: oauth2
flows:
implicit:
authorizationUrl: ''
scopes: {}
security:
- oAuth: []

View File

@ -240,9 +240,18 @@ public class ApiClient extends JavaTimeFormatter {
* @param accessToken Access token
*/
public void setAccessToken(String accessToken) {
setAccessToken(() -> accessToken);
}
/**
* Helper method to set the supplier of access tokens for OAuth2 authentication.
*
* @param tokenSupplier The supplier of bearer tokens
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
for (Authentication auth : authentications.values()) {
if (auth instanceof OAuth) {
((OAuth) auth).setAccessToken(accessToken);
((OAuth) auth).setAccessToken(tokenSupplier);
return;
}
}

View File

@ -1,24 +1,48 @@
package org.openapitools.client.auth;
import java.util.Optional;
import java.util.function.Supplier;
import org.springframework.http.HttpHeaders;
import org.springframework.util.MultiValueMap;
/**
* Provides support for RFC 6750 - Bearer Token usage for OAUTH 2.0 Authorization.
*/
@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0-SNAPSHOT")
public class OAuth implements Authentication {
private String accessToken;
private Supplier<String> tokenSupplier;
/**
* Returns the bearer token used for Authorization.
*
* @return The bearer token
*/
public String getAccessToken() {
return accessToken;
return tokenSupplier.get();
}
/**
* Sets the bearer access token used for Authorization.
*
* @param bearerToken The bearer token to send in the Authorization header
*/
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
setAccessToken(() -> accessToken);
}
/**
* Sets the supplier of bearer tokens used for Authorization.
*
* @param tokenSupplier The supplier of bearer tokens to send in the Authorization header
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
this.tokenSupplier = tokenSupplier;
}
@Override
public void applyToParams(MultiValueMap<String, String> queryParams, HttpHeaders headerParams, MultiValueMap<String, String> cookieParams) {
if (accessToken != null) {
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
}
Optional.ofNullable(tokenSupplier).map(Supplier::get).ifPresent(accessToken ->
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)
);
}
}

View File

@ -240,9 +240,18 @@ public class ApiClient extends JavaTimeFormatter {
* @param accessToken Access token
*/
public void setAccessToken(String accessToken) {
setAccessToken(() -> accessToken);
}
/**
* Helper method to set the supplier of access tokens for OAuth2 authentication.
*
* @param tokenSupplier The supplier of bearer tokens
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
for (Authentication auth : authentications.values()) {
if (auth instanceof OAuth) {
((OAuth) auth).setAccessToken(accessToken);
((OAuth) auth).setAccessToken(tokenSupplier);
return;
}
}

View File

@ -1,24 +1,48 @@
package org.openapitools.client.auth;
import java.util.Optional;
import java.util.function.Supplier;
import org.springframework.http.HttpHeaders;
import org.springframework.util.MultiValueMap;
/**
* Provides support for RFC 6750 - Bearer Token usage for OAUTH 2.0 Authorization.
*/
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0-SNAPSHOT")
public class OAuth implements Authentication {
private String accessToken;
private Supplier<String> tokenSupplier;
/**
* Returns the bearer token used for Authorization.
*
* @return The bearer token
*/
public String getAccessToken() {
return accessToken;
return tokenSupplier.get();
}
/**
* Sets the bearer access token used for Authorization.
*
* @param bearerToken The bearer token to send in the Authorization header
*/
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
setAccessToken(() -> accessToken);
}
/**
* Sets the supplier of bearer tokens used for Authorization.
*
* @param tokenSupplier The supplier of bearer tokens to send in the Authorization header
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
this.tokenSupplier = tokenSupplier;
}
@Override
public void applyToParams(MultiValueMap<String, String> queryParams, HttpHeaders headerParams, MultiValueMap<String, String> cookieParams) {
if (accessToken != null) {
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
}
Optional.ofNullable(tokenSupplier).map(Supplier::get).ifPresent(accessToken ->
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)
);
}
}

View File

@ -240,9 +240,18 @@ public class ApiClient extends JavaTimeFormatter {
* @param accessToken Access token
*/
public void setAccessToken(String accessToken) {
setAccessToken(() -> accessToken);
}
/**
* Helper method to set the supplier of access tokens for OAuth2 authentication.
*
* @param tokenSupplier The supplier of bearer tokens
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
for (Authentication auth : authentications.values()) {
if (auth instanceof OAuth) {
((OAuth) auth).setAccessToken(accessToken);
((OAuth) auth).setAccessToken(tokenSupplier);
return;
}
}

View File

@ -1,24 +1,48 @@
package org.openapitools.client.auth;
import java.util.Optional;
import java.util.function.Supplier;
import org.springframework.http.HttpHeaders;
import org.springframework.util.MultiValueMap;
/**
* Provides support for RFC 6750 - Bearer Token usage for OAUTH 2.0 Authorization.
*/
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0-SNAPSHOT")
public class OAuth implements Authentication {
private String accessToken;
private Supplier<String> tokenSupplier;
/**
* Returns the bearer token used for Authorization.
*
* @return The bearer token
*/
public String getAccessToken() {
return accessToken;
return tokenSupplier.get();
}
/**
* Sets the bearer access token used for Authorization.
*
* @param bearerToken The bearer token to send in the Authorization header
*/
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
setAccessToken(() -> accessToken);
}
/**
* Sets the supplier of bearer tokens used for Authorization.
*
* @param tokenSupplier The supplier of bearer tokens to send in the Authorization header
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
this.tokenSupplier = tokenSupplier;
}
@Override
public void applyToParams(MultiValueMap<String, String> queryParams, HttpHeaders headerParams, MultiValueMap<String, String> cookieParams) {
if (accessToken != null) {
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
}
Optional.ofNullable(tokenSupplier).map(Supplier::get).ifPresent(accessToken ->
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)
);
}
}

View File

@ -303,9 +303,18 @@ public class ApiClient extends JavaTimeFormatter {
* @param accessToken Access token
*/
public void setAccessToken(String accessToken) {
setAccessToken(() -> accessToken);
}
/**
* Helper method to set the supplier of access tokens for OAuth2 authentication.
*
* @param tokenSupplier The supplier of bearer tokens
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
for (Authentication auth : authentications.values()) {
if (auth instanceof OAuth) {
((OAuth) auth).setAccessToken(accessToken);
((OAuth) auth).setAccessToken(tokenSupplier);
return;
}
}

View File

@ -1,24 +1,48 @@
package org.openapitools.client.auth;
import java.util.Optional;
import java.util.function.Supplier;
import org.springframework.http.HttpHeaders;
import org.springframework.util.MultiValueMap;
/**
* Provides support for RFC 6750 - Bearer Token usage for OAUTH 2.0 Authorization.
*/
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0-SNAPSHOT")
public class OAuth implements Authentication {
private String accessToken;
private Supplier<String> tokenSupplier;
/**
* Returns the bearer token used for Authorization.
*
* @return The bearer token
*/
public String getAccessToken() {
return accessToken;
return tokenSupplier.get();
}
/**
* Sets the bearer access token used for Authorization.
*
* @param bearerToken The bearer token to send in the Authorization header
*/
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
setAccessToken(() -> accessToken);
}
/**
* Sets the supplier of bearer tokens used for Authorization.
*
* @param tokenSupplier The supplier of bearer tokens to send in the Authorization header
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
this.tokenSupplier = tokenSupplier;
}
@Override
public void applyToParams(MultiValueMap<String, String> queryParams, HttpHeaders headerParams, MultiValueMap<String, String> cookieParams) {
if (accessToken != null) {
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
}
Optional.ofNullable(tokenSupplier).map(Supplier::get).ifPresent(accessToken ->
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)
);
}
}

View File

@ -298,9 +298,18 @@ public class ApiClient extends JavaTimeFormatter {
* @param accessToken Access token
*/
public void setAccessToken(String accessToken) {
setAccessToken(() -> accessToken);
}
/**
* Helper method to set the supplier of access tokens for OAuth2 authentication.
*
* @param tokenSupplier The supplier of bearer tokens
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
for (Authentication auth : authentications.values()) {
if (auth instanceof OAuth) {
((OAuth) auth).setAccessToken(accessToken);
((OAuth) auth).setAccessToken(tokenSupplier);
return;
}
}

View File

@ -1,24 +1,48 @@
package org.openapitools.client.auth;
import java.util.Optional;
import java.util.function.Supplier;
import org.springframework.http.HttpHeaders;
import org.springframework.util.MultiValueMap;
/**
* Provides support for RFC 6750 - Bearer Token usage for OAUTH 2.0 Authorization.
*/
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0-SNAPSHOT")
public class OAuth implements Authentication {
private String accessToken;
private Supplier<String> tokenSupplier;
/**
* Returns the bearer token used for Authorization.
*
* @return The bearer token
*/
public String getAccessToken() {
return accessToken;
return tokenSupplier.get();
}
/**
* Sets the bearer access token used for Authorization.
*
* @param bearerToken The bearer token to send in the Authorization header
*/
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
setAccessToken(() -> accessToken);
}
/**
* Sets the supplier of bearer tokens used for Authorization.
*
* @param tokenSupplier The supplier of bearer tokens to send in the Authorization header
*/
public void setAccessToken(Supplier<String> tokenSupplier) {
this.tokenSupplier = tokenSupplier;
}
@Override
public void applyToParams(MultiValueMap<String, String> queryParams, HttpHeaders headerParams, MultiValueMap<String, String> cookieParams) {
if (accessToken != null) {
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
}
Optional.ofNullable(tokenSupplier).map(Supplier::get).ifPresent(accessToken ->
headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)
);
}
}