无效签名 - Google JWT API
Posted
技术标签:
【中文标题】无效签名 - Google JWT API【英文标题】:Invalid Signature - Google JWT API 【发布时间】:2018-06-14 20:13:31 【问题描述】:我正在尝试签署对 Google 0Auth2 的请求(在 php 中) 这是我的代码:
$jwtHeader = $this->base64url_encode(json_encode(array(
"alg" => "RS256",
"typ" => "JWT"
)));
$now = time();
$jwtClaim = $this->base64url_encode(json_encode(array(
"iss" => "xxxxxxxxxxxxxxx.xxx.gserviceaccount.com",
"scope" => "https://www.googleapis.com/auth/prediction",
"aud" => "https://www.googleapis.com/oauth2/v4/token",
"iat" => $now,
"exp" => $now + 3600,
)));
$sign = hash_hmac('SHA256', $jwtHeader.".".$jwtClaim, $secret);
$jwtAssertion = $jwtHeader.".".$jwtClaim.".".$sign;
$client = new \GuzzleHttp\Client();
$res = $client->post('https://www.googleapis.com/oauth2/v4/token', ['headers' => ['Content-Type: application/x-www-form-urlencoded'], 'form_params' => ['grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', 'assertion' => $jwtAssertion]]);
if ($res->getStatusCode() == 200)
return $res->getBody()->getContents();
//BASE64 METHOD
public function base64url_encode($data)
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
我得到的回应是
"error": "invalid_grant",
"error_description": "Invalid JWT Signature."
现在已经有几个小时了,仍然遇到同样的错误。有人遇到过这个吗? 如有任何建议,我将不胜感激。
【问题讨论】:
很难说RS256是不对称的,你有公钥设置吗?你确定urn:ietf:params:oauth:grant-type:jwt-bearer
是预期的吗?你能不能也显示 base64url_encode 方法,除了代码看起来不错。
宾果游戏,你不是对 hmac 签名进行 base64 化
@LawrenceCherone 感谢您的回复。设置服务帐户后,我从下载的 json 文件中获取了私钥,这里是我的$secret
。 urn:ietf:params:oauth:grant-type:jwt-bearer
是的,这就是文档所说的。 base64url_encode 方法只是一个没有填充的 base64_encode。我将更新问题以包含该方法
我也确实将签名编码为 base64。仍然有同样的错误
【参考方案1】:
好吧,为了那些可能遇到同样问题的人。我就是这样解决的:
$jwtHeader = $this->base64url_encode(json_encode(array(
"alg" => "RS256",
"typ" => "JWT"
)));
$now = time();
$jwtClaim = $this->base64url_encode(json_encode(array(
"iss" => "xxxxxxxxxxxxxxxxxx.xxx.gserviceaccount.com",
"scope" => "https://www.googleapis.com/auth/prediction",
"aud" => "https://www.googleapis.com/oauth2/v4/token",
"iat" => $now,
"exp" => $now + 3600,
)));
$secret = "-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxxxxx\n-----END PRIVATE KEY-----\n";
$binary_signature = "";
$algo = "SHA256";
openssl_sign($jwtHeader.".".$jwtClaim, $binary_signature, $secret, $algo);
$jwtSign = $this->base64url_encode($binary_signature);
$jwtAssertion = $jwtHeader.".".$jwtClaim.".".$jwtSign;
$client = new \GuzzleHttp\Client();
$res = $client->post('https://www.googleapis.com/oauth2/v4/token', ['headers' => ['Content-Type: application/x-www-form-urlencoded; charset=utf-8'], 'form_params' => ['grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', 'assertion' => $jwtAssertion]]);
if ($res->getStatusCode() == 200)
return $res->getBody()->getContents();
public function base64url_encode($data)
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
这按预期工作。
【讨论】:
以上是关于无效签名 - Google JWT API的主要内容,如果未能解决你的问题,请参考以下文章
Google Analytics:尝试进行授权 API 调用时,JWT 签名无效 (invalid_grant)
使用 Java 从 Google 请求 OAUTH 的 JWT 签名无效
尝试连接到 Google Oauth for google API 时 JWT 无效