Google API -> 无法从 JWT 获取访问令牌
Google API -> Unable to obtain access token from JWT
我想使用从服务器生成的帐户服务令牌调用 Google API 分析。
我遵循了这方面的指南link
这是我生成签名 JSON Web 令牌的代码:
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 服务从已签名的 JWT
生成 access_token 时
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."
}
有什么提示吗?
使用 echo "${SIGNED_JWT}" | cut -d. -f2 | base64 --decode
解码 JWT 断言声明集,您会看到没有 scope
属性。
GoogleCredential
实例具有作用域,但它们没有传递给 JWT 构建器。
在 JWT.create()
:
之后使用此附加方法添加范围
.withClaim("scope", credential.getServiceAccountScopesAsString())
我想使用从服务器生成的帐户服务令牌调用 Google API 分析。
我遵循了这方面的指南link
这是我生成签名 JSON Web 令牌的代码:
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 服务从已签名的 JWT
生成 access_token 时 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."
}
有什么提示吗?
使用 echo "${SIGNED_JWT}" | cut -d. -f2 | base64 --decode
解码 JWT 断言声明集,您会看到没有 scope
属性。
GoogleCredential
实例具有作用域,但它们没有传递给 JWT 构建器。
在 JWT.create()
:
.withClaim("scope", credential.getServiceAccountScopesAsString())