Spring Boot OAuth2 и Oracle IDCS: UW Set JWK отвечает 401 UNAUTHORIZED, нужен токен - PullRequest
0 голосов
/ 16 апреля 2020

Я создаю 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 вручную установить ключи подписи? Подробная конфигурация здесь не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...