Проблема с аутентификацией Google API OAuth2.0: невозможно получить правильный ответ - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь сгенерировать веб-токен Json (JWT), следуя этому руководству: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#callinganapi.

Я уже видел такие вопросы, как Аутентификация Google API OAuth 2.0, возвращающая «invalid_grant» - возможная проблема с форматом подписи закрытого ключа? , и следовал решениям и предложениям для составления собственного запроса. Я использую следующий код:

$JWT_Header = array("alg" => "RS256","typ" => "JWT");
$now = time();
$JWT_Body = array(
  "iss" => "client_email_in_json_file",
  "scope" => "https://www.googleapis.com/auth/cloud-translation",
  "aud" => "https://www.googleapis.com/oauth2/v4/token",
  "exp" => $now+3600,
  "iat" => $now
];
$jwtHeader = rtrim(strtr(base64_encode(json_encode($JWT_Header)), '+/', '-_'), '=');
$jwtClaim rtrim(strtr(base64_encode(json_encode($JWT_Body)), '+/', '-_'),'=');
$private_key =
  "-----BEGIN PRIVATE KEY-----This_is_a_private_key-----END PRIVATE KEY-----\n";
$jwtSig = null;
openssl_sign(
  $jwtHeader.".".$jwtClaim,
  $jwtSig,
  $private_key,
  "sha256WithRSAEncryption"
);
$jwtSig =rtrim(strtr(base64_encode($jwtSig), '+/', '-_'), '=');

$jwtAssertion = $jwtHeader.".".$jwtClaim.".".$jwtSig;
$headers = array(
  'Host: accounts.google.com',
  'Content-Type: application/x-www-form-urlencoded'
);
$fields = array(
 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
 'assertion'  => PHP\urlencode($jwtAssertion)
);
$fields_string = '';
foreach($fields as $key => $value) $fields_string .= '&'.$key.'='.$value;
$fields_string = substr($fields_string, 1);
$ch = PHP\curl_init();
$url = 'https://accounts.google.com/o/oauth2/token';
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_HEADER, TRUE );
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, PHP\count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1 );
$result = curl_exec($ch);
curl_close($ch);

Я ожидал получить правильный токен доступа как $ response, но после запуска этого фрагмента кода я мог получить только $ result = false. Может ли быть какая-либо возможная причина для получения этого ответа? Цени любую помощь!

...