使用PHP客户端库获取访问令牌问题

时间:2018-12-19 10:52:16

标签: access-token google-my-business-api

我正在尝试将几个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时返回了OAuth,但最终却出现了Permission Denied错误,即使我在凭据下将GMB API添加到了白名单中。

1 个答案:

答案 0 :(得分:0)

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