Google 我的审核业务 API 中的请求缺少必需的身份验证凭据

Request is missing required authentication credential in Google my businness for Review API

我正在尝试集成 My business API 以获取我网站上 google 位置的所有 google reviews。 我看了几个答案,但无法找到问题所在。 我面临着如何让访问令牌继续进行的问题。我已经通过了设置 OAuth 同意步骤后从开发人员控制台获得的以下内容。

'CLIENT_SECRET_PATH'=> 'client_secret_77331013078-oknip449r6oat5va0ef974d7nd7ncf1o.apps.googleusercontent.com.json'
'CREDENTIALS_PATH'=> 'credentials.json'

我的代码:

$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
$client = new Google_Client();
$client->setApplicationName(APPLICATION_NAME); 
$client->setAuthConfigFile(CLIENT_SECRET_PATH);
$client->addScope("https://www.googleapis.com/auth/plus.business.manage");
// https://www.googleapis.com/auth/business.manage
$client->setRedirectUri($redirect_uri);
// For retrieving the refresh token
$client->setAccessType("offline");
$client->setApprovalPrompt("auto");
/************************************************
We are going to create the Google My Business API
service, and query it.
************************************************/
$mybusinessService = new Google_Service_Mybusiness($client);
$credentialsPath = CLIENT_SECRET_PATH;
if (isset($_GET['code'])) {
  // Exchange authorization code for an access token.
  $accessToken = $client->authenticate($_GET['code']);
  // Store the credentials to disk.
  if (!file_exists(dirname($credentialsPath))) {
    mkdir(dirname($credentialsPath), 0700, true);
  }
  file_put_contents($credentialsPath, $accessToken);
  $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}
 
// Load previously authorized credentials from a file.
if (file_exists($credentialsPath)) {
  $accessToken = file_get_contents($credentialsPath);
  $client->setAccessToken($accessToken);
  // // Refresh the token if it's expired.
  if ($client->isAccessTokenExpired()) {
    $client->refreshToken($client->getRefreshToken());
    file_put_contents($credentialsPath, $client->getAccessToken());
  }
} else {
  // Request authorization from the user.
  $authUrl = $client->createAuthUrl();
}

完整错误代码:

Error 1: Uncaught InvalidArgumentException: Invalid token format=> Google\Client->setAccessToken(Array) #1 {main} thrown 

Error 2: {
   "error":{
      "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.",
      "errors":[
         {
            "message":"Login Required.",
            "domain":"global",
            "reason":"required",
            "location":"Authorization",
            "locationType":"header"
         }
      ],
      "status":"UNAUTHENTICATED"
   }
}

我对第一个 Error1 的认识是 Access token 不是正确的格式。它从 client****.json 格式的 JSON 文件中获取内容。我该如何解决?以便它创建访问令牌?

另外还需要做些什么才能解决这两个错误?请指导我。

您的错误可能源于 CLIENT_SECRET_PATH 应该是您从 Google 开发者控制台下载的 credentials.json 文件的路径。不仅仅是客户端 ID。

确保您创建了网络浏览器凭据。

您的代码如何工作

听起来你并不完全理解你的代码是如何工作的。这是您第一次 运行 时会发生什么。

它会到达这个部分

$authUrl = $client->createAuthUrl();

这将打开授权 window 并且可能 google 登录 window。一旦发生这种情况,它将重新路由到您的代码并点击

if (isset($_GET['code'])) {

因为它将在查询参数中返回一个代码(授权代码)。

那时因为

if (!file_exists(dirname($credentialsPath))) {

不存在,届时将为您创建一个新文件。

下次您的代码 运行 将有一个文件,因此以下内容为真

if (file_exists($credentialsPath)) {

因此它将使用文件中的代码为您获取一个新的访问令牌。

注意:如所写,您的代码将是单用户的。