Я создаю OpenID / OAuth2 клиента для Oracle IDCS
. Сначала я протестировал конфигурацию Spring-Boot с Google и GitHub, и она работала просто отлично. Однако, когда я пытался интегрироваться с Oracle IDCS
, я получал 401 Unauthorized
, когда приложение пытается получить ключи подписи из URI JWK Set (https://idcs-XXXXXXXXX.identity.oraclecloud.com/admin/v1/SigningCert/jwk). Я узнал, что для Oracle IDCS JWK Set URI требуется токен в заголовке (Authorization: Bearer <Access Token Value>
). Это не относится к Google и GitHub.
application.yml
spring:
main:
banner-mode: "console"
jpa:
hibernate:
ddl-auto: "create-drop"
security:
oauth2:
client:
registration:
oracle:
client-id: XXXXXX
client-secret: XXXXXX
authorization-grant-type: authorization_code
redirect-uri: "http://localhost:8080/login/oauth2/code/oracle"
scope: openid
client-name: Oracle
provider: oracle
provider:
oracle:
authorization-uri: "https://idcs-XXXXXXXXX.identity.oraclecloud.com/oauth2/v1/authorize"
token-uri: "https://idcs-XXXXXXXXX.identity.oraclecloud.com/oauth2/v1/token"
user-info-uri: "https://idcs-XXXXXXXXX.identity.oraclecloud.com/oauth2/v1/userinfo"
jwk-set-uri: "https://idcs-XXXXXXXXX.identity.oraclecloud.com/admin/v1/SigningCert/jwk"
token-info-uri: "https://idcs-XXXXXXXXX.identity.oraclecloud.com/oauth2/v1/introspect"
user-name-attribute: name
profiles:
active: "@spring.profiles.active@"
фрагмент из org.springframework.security.oauth2.jwt.NimbusJwtDecoder
private static class RestOperationsResourceRetriever implements ResourceRetriever {
private static final MediaType APPLICATION_JWK_SET_JSON = new MediaType("application", "jwk-set+json");
private final RestOperations restOperations;
RestOperationsResourceRetriever(RestOperations restOperations) {
Assert.notNull(restOperations, "restOperations cannot be null");
this.restOperations = restOperations;
}
@Override
public Resource retrieveResource(URL url) throws IOException {
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON, APPLICATION_JWK_SET_JSON));
ResponseEntity<String> response;
try {
RequestEntity<Void> request = new RequestEntity<>(headers, HttpMethod.GET, url.toURI());
response = this.restOperations.exchange(request, String.class);
} catch (Exception ex) {
throw new IOException(ex);
}
if (response.getStatusCodeValue() != 200) {
throw new IOException(response.toString());
}
return new Resource(response.getBody(), "UTF-8");
}
}
}
ОБНОВЛЕНИЕ: Ручная отправка HTTP-запроса GET с токеном в JWK Set URI дает мне ключи.
curl -v -k -X GET -H "Content-Type:application/json" -H "Authorization: Bearer XXXXXXXXX" https://idcs-XXXXXXXXX.identity.oraclecloud.com/admin/v1/SigningCert/jwk
{
"keys":[
{
"kty":"RSA",
"x5t#S256":"XXXX",
"e":"XXXX",
"x5t":"XXXX",
"kid":"SIGNING_KEY",
"x5c":[
"XXXX",
"XXXX"
],
"key_ops":[
"encrypt",
"verify"
],
"alg":"RS256",
"n":"XXXX"
}
]
}
Как сделать Я go о включении токена в заголовок запроса HTTP GET для URI JWK Set?
Есть ли способ в клиенте Spring Boot OAuth2 вручную установить ключи подписи? Подробная конфигурация здесь не работает.