0

我正在尝试将几个 Google API 调用集成到自定义 Drupal 8 模块中。

在尝试做任何其他事情之前,我基本上是在尝试首先让我的自定义类通过 OAuth 从 Google 获取访问令牌。我通过在一个地方使用一个类函数来做到这一点。功能如下:

public function testTokenRequest(): void
{
    // Setup Google Client Config within context of initialized class
    $this->googleClient->setClientId($this->googleClientID);
    $this->googleClient->setClientSecret($this->googleClientSecret);
    $this->googleClient->setDeveloperKey($this->googleApiKey);

    // Add Google MyBusiness scope
    $this->googleClient->setScopes(array('https://www.googleapis.com/auth/plus.business.manage'));

    try {
        $accessToken = $this->googleClient->getAccessToken(); // null returned where breakpoint hit

        $this->googleAccessToken = $accessToken; // Put xdebug breakpoint here
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }
}

目前我得到的只是$accessToken = $this->googleClient->getAccessToken();调用返回的空值。

不确定我哪里出错了,可能是 AddScopes 调用,因为 apiclient 的供应商文档的做法略有不同,即$client->addScope(Google_Service_Plus::PLUS_ME);但我找不到用于 MyBusinessAPI 范围的正确类,因此使用了 OAuth 操场字符串https://www.googleapis.com/auth/plus.business.manage

当我使用它时,我得到了一个返回的 OAuth Playground AccessToken,但最终却出现了 Permission Denied 错误,即使我在凭据下将 GMB API 添加到了我的白名单中。

4

1 回答 1

-1

Google MyBusiness 基于 Oauth2。在用户批准您的应用之前不会收到访问令牌,如果用户尚未批准该应用,则该函数返回 null 是正常的。

下面是一个示例,说明如何创建一个链接,将用户发送到该链接以开始对您的应用进行身份验证和授权。

        $client = new \Google_Client();
        $client->setAuthConfig(getcwd() . '/../client_secret.apps.googleusercontent.com.json');
        $client->setAccessType("offline");        // offline access
        $client->setIncludeGrantedScopes(true);   // incremental auth
        $client->addScope(
            array(
                'https://www.googleapis.com/auth/userinfo.email',
                'https://www.googleapis.com/auth/userinfo.profile',
                'https://www.googleapis.com/auth/plus.business.manage'
            )
        );
        $client->setRedirectUri('http://server.com/code');
        $client->setApprovalPrompt('force');

        return new Response(
            '<html><body>Authenticate here : <a href="' .
            $auth_url = filter_var($client->createAuthUrl(), FILTER_SANITIZE_URL)
            . '">HERE</a></body></html>'
        );

上面的示例假设您的服务器还将实现一个/code端点,用户使用授权令牌重定向到该端点,然后您需要调用 api 以将令牌与访问和刷新代码交换。

本文档将帮助您进一步了解 https://developers.google.com/api-client-library/php/auth/web-app

于 2019-01-24T11:09:30.667 回答