Oauth 2.0 尝试为Google API连接到Google Oauth时JWT无效

Oauth 2.0 尝试为Google API连接到Google Oauth时JWT无效,oauth-2.0,google-api,google-oauth,jwt,Oauth 2.0,Google Api,Google Oauth,Jwt,我试图通过JWT通过OAuth连接到Google API,但我一直遇到以下错误: {“error”:“invalid_grant”,“error_description”:“invalid JWT:Token必须是短期的Token并且在合理的时间范围内”} 在我的JWT calim中,我将iat设置为当前时间减去1970-01-01(以秒为单位),exp设置为iat+3600,因此我不知道为什么仍会出现此错误。如果有人知道答案,请告诉Meeeee 如果您在这里按照HTTP/Rest下的步骤操作:

我试图通过JWT通过OAuth连接到Google API,但我一直遇到以下错误:

{“error”:“invalid_grant”,“error_description”:“invalid JWT:Token必须是短期的Token并且在合理的时间范围内”}


在我的JWT calim中,我将iat设置为当前时间减去1970-01-01(以秒为单位),exp设置为iat+3600,因此我不知道为什么仍会出现此错误。如果有人知道答案,请告诉Meeeee

如果您在这里按照HTTP/Rest下的步骤操作:
,您将看到您的服务帐户支持RSA SHA-256,并且您似乎使用了HMAC。

不确定您是否使用过它,但以下简单步骤对我使用PHP函数很有效:

//helper函数
函数base64url_encode($data){
返回rtrim(strtr(base64_encode($data),“+/”、“-”、“=”);
}
//谷歌创建JWT的文档:https://developers.google.com/identity/protocols/OAuth2ServiceAccount#authorizingrequests
//{Base64url编码的JSON头}
$jwtHeader=base64url\u编码(json\u编码(数组(
“alg”=>“RS256”,
“典型”=>“JWT”
)));
//{Base64url编码的JSON声明集}
$now=时间();
$jwtClaim=base64url\u encode(json\u encode(数组(
“iss”=>“761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
“范围”=>“https://www.googleapis.com/auth/prediction",
“澳元”=>“https://www.googleapis.com/oauth2/v4/token",
“exp”=>$now+3600,
“iat”=>现在$
)));
//签名的基本字符串:{Base64url编码的JSON标头}.{Base64url编码的JSON声明集}
openssl_标志(
$jwtHeader.“.”$jwtClaim,
$jwtSig,
$U private\u key\u来自google\u api\u控制台,
“使用RSA加密的SHA256”
);
$jwtSig=base64url\u编码($jwtSig);
//{Base64url编码的JSON头}.{Base64url编码的JSON声明集}.{Base64url编码的签名}
$jwtAssertion=$jwtHeader.“$jwtClaim.”$jwtSig;

如果您看到此错误,必须为令牌设置正确的过期时间。例如:

var currentTime = new Date().getTime() / 1000; //must be in seconds
var exp = currentTime + 60;

var auth_claimset = {
      iss       :   "...",
      scope     :   "...",
      aud       :   "...",
      exp       :   exp,
      iat       :   currentTime 
};

我也有同样的问题,我通过将我的虚拟机时间与公共ntpserver同步来解决它:

ntpdate ntp.ubuntu.com

WSL也会发生这种情况,如果您在Windows中Docker上具有WSL2后端的本地开发机器上进行测试,则会导致此问题

您需要安装ntpdate

sudo apt install ntpdate
然后你需要设定时间

sudo ntpdate time.windows.com

这篇文章写得很好-

你是在发表自己的JWT声明吗?时间需要是当前时间NTP感谢您的回复,我将时间设置为UTC,现在我收到一个无效的签名错误,您知道我做错了什么吗?$sig=hash_hmac('sha256',utf8_encode($base64encodedHeaderAndPayload),“----开始私钥------\n私钥\n------结束私钥------\n”)$签名=base64url\u编码($sig);请注意,我曾尝试创建自己的JWT令牌,但我使用的JWT令牌在使用Google客户端库时遇到了问题。您使用的是什么语言?也许您可以将客户端库代码分离出来。因此,我已修改为以下代码:“$sig=hash('SHA256',$headerAndPayload,$secret”)$签名=base64url\u编码($sig)$jwt=$headerAndPayload。"." . $签名由于某种原因,我一直得到一个无效的签名$secret是我从服务帐户密钥json文件获得的私钥。你知道怎么回事吗?我刚刚发现在PHP中使用哈希并没有使用密钥,所以我可能仍然应该使用hash_hmac,而且我没有得到结果:/似乎有一些签名库创建了符合规范的JWT。对不起,我一直忘了更新这个。这的确是正确的答案!虽然我不需要再使用它了,因为AppEngine现在允许我直接访问云存储。但还是要感谢你的正确答案!:)嘿@Joseph Shih我也有类似的问题,我的错误是
无效的JWT签名。
。你能分享你的发帖请求吗。我想我对请求正文中的
grant\u type
有问题。@Michel,无效的JWT签名错误意味着您的签名无法验证$jwtHeader和$jwtClaim。您是否使用正确的ISS(服务帐户的电子邮件地址)以及API控制台中的私钥。另外,请记住,您需要对签名进行base-64编码(如上面的示例)。更不用说@JosephShih我能够修复它。我把答案贴在这里:仍然感谢你的回复:)