尝试连接Google Oauth for google API时无效的JWT

时间:2016-04-28 08:22:43

标签: oauth-2.0 google-api google-oauth jwt

我尝试通过OAuth通过JWT连接到Google API,但我一直收到此错误:

  

{"错误":" invalid_grant"," error_description":"无效的JWT:令牌必须是一个短期令牌并且合理时间表" }

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

5 个答案:

答案 0 :(得分:2)

Not sure if you ever got it to work, but the following simple steps worked for me using the PHP function openssl_sign():

//helper function
function base64url_encode($data) { 
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); 
}

//Google's Documentation of Creating a JWT: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#authorizingrequests

//{Base64url encoded JSON header}
$jwtHeader = base64url_encode(json_encode(array(
    "alg" => "RS256",
    "typ" => "JWT"
)));
//{Base64url encoded JSON claim set}
$now = time();
$jwtClaim = base64url_encode(json_encode(array(
    "iss" => "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
    "scope" => "https://www.googleapis.com/auth/prediction",
    "aud" => "https://www.googleapis.com/oauth2/v4/token",
    "exp" => $now + 3600,
    "iat" => $now
)));
//The base string for the signature: {Base64url encoded JSON header}.{Base64url encoded JSON claim set}
openssl_sign(
    $jwtHeader.".".$jwtClaim,
    $jwtSig,
    $your_private_key_from_google_api_console,
    "sha256WithRSAEncryption"
);
$jwtSign = base64url_encode($jwtSig);

//{Base64url encoded JSON header}.{Base64url encoded JSON claim set}.{Base64url encoded signature}
$jwtAssertion = $jwtHeader.".".$jwtClaim.".".$jwtSig;

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

我有同样的问题,我通过同步我的虚拟机时间来解决它,以便使用公共ntpserver正确的一个:

ntpdate ntp.ubuntu.com

答案 3 :(得分:0)

如果您在此处遵循HTTP / Rest下的步骤: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#formingheader,您会看到您的服务帐户支持RSA SHA-256,并且您似乎使用了HMAC。

答案 4 :(得分:0)

如果您在 Windows Docker 上使用 WSL2 后端在本地开发机器上进行测试,WSL 也会发生这种情况。

您需要安装ntpdate

sudo apt install ntpdate

然后你需要设置时间。

sudo ntpdate time.windows.com

这里的好文章 - https://tomssl.com/fixing-clock-drift-in-wsl2-using-windows-terminal/