Google API -> Невозможно получить токен доступа от JWT - PullRequest
1 голос
/ 28 февраля 2020

Я хочу вызвать Google API Analytics с помощью токена службы учетной записи, сгенерированного с сервера.

Я следовал инструкциям по этой ссылке

Это мой код для создания подписанных JSON Веб-токен:

    final GoogleCredential credential = GoogleCredential.fromStream(JWTSample.class.getResourceAsStream ("/account_secrets.json"))
            .createScoped(List.of(
                    "https://www.googleapis.com/auth/analytics",
                    "https://www.googleapis.com/auth/analytics.readonly")
            );
    final PrivateKey privateKey = credential.getServiceAccountPrivateKey();
    final String privateKeyId = credential.getServiceAccountPrivateKeyId();
    try {

        long now = System.currentTimeMillis();

        Algorithm algorithm = Algorithm.RSA256(null, (RSAPrivateKey) privateKey);
        String signedJwt = JWT.create()
                .withKeyId(privateKeyId)
                .withIssuer("test-295@symbolic-folio-268713.iam.gserviceaccount.com")
                .withAudience("https://oauth2.googleapis.com/token")
                .withIssuedAt(new Date(now))
                .withExpiresAt(new Date(now + 3600 * 1000L))
                .sign(algorithm);
        System.out.println(signedJwt);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

Выход представляет собой подписанный JWT.

Когда я вызываю службу Oauth2 для генерации access_token из подписанного JWT

 curl -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=<signed_JWT>' https://oauth2.googleapis.com/token

Я получаю эта ошибка:

{
    "error": "invalid_scope",
    "error_description": "Invalid oauth scope or ID token audience provided."
}

Есть подсказки?

1 Ответ

4 голосов
/ 29 февраля 2020

Расшифруйте набор утверждений утверждения JWT с помощью echo "${SIGNED_JWT}" | cut -d. -f2 | base64 --decode, и вы увидите, что атрибута scope нет.

Экземпляр GoogleCredential имеет области действия, но они не передаются в компоновщик JWT.

Добавьте области с помощью этого дополнительного метода после вашего JWT.create():

.withClaim("scope", credential.getServiceAccountScopesAsString())
...