JWT と Java Auth クライアント API 呼び出しを使用してアクセス トークンを取得しようとしましたが、成功しませんでした。
以下の Java クライアント API コードを使用すると、「java.net.SocketTimeoutException: connect timed out」という例外が発生します。
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("@developer.gserviceaccount.com")
.setServiceAccountPrivateKeyFromP12File(new File("<publickey>-privatekey.p12"))
.setServiceAccountScopes("https://www.googleapis.com/auth/devstorage.full_control")
.build();
credential.refreshToken();
System.out.println("access token : " + credential.getAccessToken());
System.out.println("refresh token : " + credential.getRefreshToken());
「credential.refreshtoken()」の呼び出しを削除すると、null アクセス キーと更新キーが返されます。誰かが私を導き、どこが間違っているのか教えてもらえますか?
また、以下に示すように、認証に直接 JWT トークンを使用すると、「{"error" : "invalid_grant"}」というエラー コード 400 の応答が返されます。
private static PrivateKey getPrivateKey(String keyFile, String alias, String password)
throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException
{
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream(keyFile), password.toCharArray());
PrivateKey privateKey = (PrivateKey) keystore.getKey(alias, password.toCharArray());
return privateKey;
}
public static String sign(PrivateKey privateKey, JsonFactory jsonFactory,
String header, String payload) throws Exception {
System.out.println("header : " + header + " : " + Base64.encodeBase64URLSafeString(header.getBytes()));
System.out.println("payload : " + payload + " : " + Base64.encodeBase64URLSafeString(payload.getBytes()));
String content = Base64.encodeBase64URLSafeString(header.getBytes()) + "."
+ Base64.encodeBase64URLSafeString(payload.getBytes());
byte[] contentBytes = StringUtils.getBytesUtf8(content);
Signature signer = Signature.getInstance("SHA256withRSA");
signer.initSign(privateKey);
signer.update(contentBytes);
byte[] signature = signer.sign();
String signedContent = content + "." + Base64.encodeBase64URLSafeString(signature);
System.out.println("signedContent:" + signedContent);
return signedContent;
}
public static void main(String args[]) {
HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
String header = "{\"alg\":\"RS256\",\"typ\":\"JWT\"} ";
String payload = "{\"iss\":\"*******@developer.gserviceaccount.com\",\"scope\":\"https://www.googleapis.com/auth/devstorage.full_control\",\"aud\":\"https://accounts.google.com/o/oauth2/token\",\"exp\": " + new Date().getTime() + ",\"iat\":" + (new Date().getTime() + 3600000) + "}";
PrivateKey serviceAccountPrivateKey = getPrivateKey("<public_key>-privatekey.p12", "privatekey", "notasecret");
String assertion = sign(serviceAccountPrivateKey, JSON_FACTORY, header, payload);
}
この生成されたアサーションと許可タイプ "urn:ietf:params:oauth:grant-type:jwt-bearer"を使用して、後でこのアサーションを API " https://accounts.google.com/o/oauth2/token " に渡すと、応答が返されます"{"error" : "invalid_grant"}" エラー コード 400。
誰かが私を助けて、どこが間違っているのか教えてもらえますか?