Google Ads APIで認証エラー

Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential.

上記のようなエラーが出た場合、認証エラーである。

アクセストークンがついてなかったり、期限切れだったり、Client ScretやClient Idが違うものだった李が原因である。

しかし、今回LaravelでHttpファサードを使った場合でも同様のエラーとなった。

PHPのGoogle Ads ライブラリでは、

OAuth2認証: Google\Auth\OAuth2 クラスを使用して認証を行い、

GuzzleHttp\Client を使用してリクエスト送信される。

今回のLaravelのHttpファサードも、GoogleCloudApiにとっては、Guzzleを使った送信のヘッダーと同様だったのかもしれない。

結局、OAuth2クラスを使った認証も、アクセストークンを取得するだけだが。

Laravelでもライブラリを使わずに、REST APIとして送信するのであれば、Httpファサードを使わずに、curlで送信しないとダメだということが分かった。

LaravelでHttpファサードを使った送信

  $response = Http::withHeaders($headers)->post($url, ['query' => $query]);
↓
 'error' => 
    array (
      'code' => 401,
      'message' => 'Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
      'status' => 'UNAUTHENTICATED',

curlで送信した場合

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POST, true); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $query); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_TIMEOUT, 120); 
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60); 
$response = curl_exec($curl);