Ошибка invalid_grant/недопустимая подпись JWT. получить токен доступа с помощью Oauth

Я долго пытался решить эту проблему. Мне нужно сгенерировать доступ к токену с учетной записью службы, чтобы использовать приложение календаря Google. Сначала я делаю JWT с библиотекой firebase/php-jwt на основе сертификата pem, где он хранит закрытый ключ, предоставленный учетной записью службы Google. После выполнения завитка в Google, чтобы получить вышеупомянутый токен, но он выдает мне следующую ошибку " "invalid_grant/Недопустимая подпись JWT"

$time = time();

$key = file_get_contents("./certs/certificado.pem");
$token = array(
    "iss" => "*****@*******.iam.gserviceaccount.com",
    "aud" => "https://www.googleapis.com/oauth2/v3/token",
    "iat" => $time,
    "exp" => $time+60,
    "scope" => "https://www.googleapis.com/auth/calendar.readonly"
);

$jwt = JWT::encode($token, $key);
$decoded = JWT::decode($jwt, $key, array('HS256'));
echo $jwt;
print_r($decoded);

$decoded_array = (array) $decoded;
$grant_type = "urn:ietf:params:oauth:grant-type:jwt-bearer";

JWT::$leeway = 600; 
$decoded = JWT::decode($jwt, $key, array('HS256'));

Пример, где я делаю завиток в Google, чтобы получить токен доступа

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"https://www.googleapis.com/oauth2/v3/token");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"grant_type=".urlencode($grant_type)."&assertion=".urlencode($jwt));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
curl_close ($ch);
echo($result);

Гугл выдает следующую ошибку

{
  "error": "invalid_grant",
  "error_description": "Invalid JWT Signature."
}

person Steven Hyde    schedule 27.06.2019    source источник
comment
Привет! У Google есть хороший пример того, как это сделать с помощью библиотеки apiclient: developers.google.com/calendar. /быстрый запуск/php   -  person spielerds    schedule 27.06.2019


Ответы (1)


Вы используете неправильный алгоритм подписи для Google OAuth. Используйте RS256.

Затем, когда у вас есть подписанный JWT, вы обмениваете его на токен доступа.

В этой статье рассказывается об использовании Python: ссылка

В этой статье показаны подробности использования CURL: ссылка

person John Hanley    schedule 27.06.2019
comment
Послушайте, я пробовал решение, которое вы мне предложили, но теперь оно выдает другую ошибку. Я оставляю это вам следующим. { "error": "unsupported_grant_type", "error_description": "Invalid grant_type: " } Я начинаю думать, что проблема в библиотеке, которую я использую - person Steven Hyde; 02.07.2019