0 レビュー
1 回答
php-GoogleAPI呼び出し中に無効なJWT署名
Cloud Firestore APIのアクセストークンを生成しようとしていますが、次のエラーが発生し続けます:-
{"error":"invalid_grant","error_description":"Invalid JWT Signature."}
編集:コードからurldecodeを削除すると、無効な署名が表示されます。
これはWebアプリのユースケースではないため、ユーザーがFirebase認証の形式でサインインせずにOauthトークンを生成したい。
https://developers.google.com/identity/protocols/oauth2/service-accountのドキュメントをフォローしました ドキュメントに記載されているエンドポイントのみを使用しました。
<?php
$config = json_decode('service_account_key',true);
$jwt_header = '{"alg":"RS256","typ":"JWT"}';
$jwt_header_cryph = urlencode(base64_encode($jwt_header));
$jwt_claim = '{
"iss": "service_account_id",
"scope":"https://www.googleapis.com/auth/datastore",
"aud":"https://oauth2.googleapis.com/token",
"exp":'.(time()+3600).',
"sub": "user_email"
"iat":'.time().'
}';
$jwt_claim_cryph = urlencode(base64_encode($jwt_claim));
$data = $jwt_header_cryph.".".$jwt_claim_cryph;
$binary_signature = "";
$algo = "SHA256";
openssl_sign($data, $binary_signature, $config['private_key'], $algo);
$jws_signature_cryph = urlencode(base64_encode($binary_signature));
$complete_request = $jwt_header_cryph.".".$jwt_claim_cryph.".".$jws_signature_cryph;
$curl_url = 'https://oauth2.googleapis.com/token';
$fields = array(
'grant_type' => urlencode('urn:ietf:params:oauth:grant-type:jwt-bearer'),
'assertion' => $complete_request
);
$fields_string = "";
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $curl_url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true );
$result = curl_exec($ch);
curl_close($ch);
$token = json_decode($result, true);
echo($token);
わからない
0
レビュー
答え :
解決策:
urlencodeは使用しないでください。この手順はHTTPヘッダーでは実行されず、base64エンコーディングが壊れます。署名の検証は、URLデコード後ではなく、渡したデータに対して実行されます。
リンクは、コードを比較できるように、私が作成したPythonの例にリンクしています。 Pythonコードを使用して、各ステップで何が生成されるかを確認します。
次のエンドポイントを呼び出すことで、アクセストークンを検証できます。
curl -H "Authorization: Bearer $ACCESS_TOKEN" https://www.googleapis.com/oauth2/v3/tokeninfo
curl -H "Authorization: Bearer $ACCESS_TOKEN" https://www.googleapis.com/oauth2/v3/userinfo
最初のエンドポイントは、アクセストークンに関する情報を返します。
2番目のエンドポイントがOIDCIDトークンを要求します。これは、将来、IDベースの認証を必要とする他のGoogleCloudサービスを使用するときに役立ちます。
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。