将Authenticated Google Client实例用于多种服务

时间:2017-04-08 10:30:18

标签: php laravel google-webmaster-tools google-client

我正在创建Google客户端实例并对其进行一次身份验证并获取所需数据。之后,如果我想将同一个Google客户端实例用于其他服务,我该如何实现呢?

webmasterMain路线是我在Google网站管理员中注册的重定向uri。

    public function webmasterMain(Request $request)
    {
        $requestData = $request->all();
        if ($request->isMethod('POST') || isset($requestData['code'])) {
            $google_redirect_url = env('APP_URL') . '/user/webmasterMain';
            $gClient = new \Google_Client();
            $gClient->setAccessType("offline");// to get refresh token after expiration of access token
            $gClient->setIncludeGrantedScopes(true);   // incremental auth
            $gClient->setApplicationName(config('services.google.app_name'));
            $gClient->setClientId(config('services.google.client_id'));
            $gClient->setClientSecret(config('services.google.client_secret'));
            $gClient->setRedirectUri($google_redirect_url);
            $gClient->setDeveloperKey(config('services.google.api_key'));
            $gClient->setScopes(array(
                'https://www.googleapis.com/auth/plus.me',
                'https://www.googleapis.com/auth/userinfo.email',
                'https://www.googleapis.com/auth/userinfo.profile',
                'https://www.googleapis.com/auth/webmasters.readonly',
                'https://www.googleapis.com/auth/webmasters',
            ));
            $google_oauthV2 = new \Google_Service_Oauth2($gClient);
            if ($request->get('code')) {
                $gClient->authenticate($request->get('code'));
                $request->session()->put('token', $gClient->getAccessToken());
            }
            if ($request->session()->get('token')) {
                $gClient->setAccessToken($request->session()->get('token'));
            }

            if ($gClient->getAccessToken()) {
                $inst = new Google_Service_Webmasters($gClient);
                $res = $inst->sites->listSites();
                $sites = $res->getSiteEntry();
                $siteUrl = [];
                foreach ($sites as $key => $site) {
                    $siteUrl = array_add($siteUrl, $key, ['site_name'=>$site['siteUrl'], 'site_permission_level' => $site['permissionLevel']]);
                }
                $sites = (((array)$siteUrl));
                return view('User::webmasterMain')->with(['data' => $sites]);
            } else {
                //For Guest user, get google login url
                $authUrl = $gClient->createAuthUrl();
                return redirect()->to($authUrl);
            }
        }
        return view('User::webmasterMain');
    }

现在假设我想获得经过身份验证的$ gClient服务,例如Google_Service_Webmasters_SearchAnalyticsQueryRequest,那么如何为下一个请求创建$ client = $ gClient?

    public function query(Request $request){
//suppose $client is the same instance which was previously authenticated and stored in $gClient
    $website = "http://example.com/";
                $searchAnalytics = new \Google_Service_Webmasters_SearchAnalyticsQueryRequest();
                $searchAnalytics->setStartDate('2017-03-01');
                $searchAnalytics->setEndDate('2017-03-31');
                $searchAnalytics->setDimensions(['page']);
                $searchAnalytics->setSearchType('web');
    `$results = $client->searchanalytics->query($website, $searchAnalytics);`
    return $results->getRows();

1 个答案:

答案 0 :(得分:0)

我得到了答案,无需保存实例或做任何事情,但请按照以下步骤操作:

  1. 创建Google客户端对象。
  2. 首次通过getAccessToken()验证从google客户端对象保存accessToken。
  3. 使用相同的访问令牌并在此google客户端中设置访问令牌。
  4. 现在您可以将此Google客户端对象用于任何服务。
  5. 首次验证:

    $gClient = new \Google_Client();
    
    验证后

    //

    $request->session()->put('token', $gClient->getAccessToken());
    

    现在,我们可以在任何Google服务电话中使用此访问令牌:

     $gClient = new \Google_Client();
    
            if ($request->session()->get('token')) {
                $gClient->setAccessToken($request->session()->get('token'));
            }
    
            $client = new Google_Service_Webmasters($gClient);