2017-09-14 5 views
0

Google_Service_BigQueryDataTransferを使用しようとしています。 サービスアカウントを作成し、jsonファイルをダウンロードしました。 jsonファイルのフルパスでGOOGLE_APPLICATION_CREDENTIALSを設定しました。 私はそれが正常に動作するソースエラーGoogle_Service_BigQueryDataTransfer

$this->service->projects_dataSources-> 
      listProjectsDataSources('projects/' . self::PROJECT_ID); 

のリストを取得

$client = new Google_Client(); 
     $client->useApplicationDefaultCredentials(); 
$client->setScopes(array(
       Google_Service_Bigquery::BIGQUERY 
      ) 
     ); 
$this->service = new Google_Service_BigQueryDataTransfer($client); 

GoogleClientとGoogle_Service_BigQueryDataTransferを作成します。

私はそれはまた、正常に動作する転送

$this->service->projects_locations_transferConfigs-> 
     listProjectsLocationsTransferConfigs(
      'projects/' . self::PROJECT_ID . '/locations/eu' 
     ); 

のリストを取得します。

私は両方の要求がnull

object(Google_Service_BigQueryDataTransfer_CheckValidCredsResponse)[174] 
    public 'hasValidCreds' => null 
........ 

と最後を返す私は転送に

 $params = new Google_Service_BigQueryDataTransfer_TransferConfig(); 
     $params->setDestinationDatasetId('stat'); 
     $params->setDisplayName('ID' . $adword_id); 
     $params->setDataSourceId(self::DATA_SOURCE_ID); 
     $params->setDataRefreshWindowDays(10); 
     $params->setDisabled(false); 
     $params->setParams(['customer_id'=> (string)$adword_id]); 
     return $this->service->projects_locations_transferConfigs->create(
      $this->getParent(). '/locations/europe', 
      $params 
     ); 
を作成しようとした資格情報

$this->service->projects_locations_dataSources-> 
    checkValidCreds(   
    'projects/'.self::PROJECT_ID.'/locations/europe/dataSources/adwords', 
    new Google_Service_BigQueryDataTransfer_CheckValidCredsRequest() 
     ); 

または

$this->service->projects_dataSources->checkValidCreds(
      'projects/'.self::PROJECT_ID.'/dataSources/adwords', 
      new Google_Service_BigQueryDataTransfer_CheckValidCredsRequest() 
     ); 

を取得

とエラー

Google_Service_Exception: { 
    "error": { 
    "code": 400, 
    "message": "Request contains an invalid argument.", 
    "errors": [ 
     { 
     "message": "Request contains an invalid argument.", 
     "domain": "global", 
     "reason": "badRequest" 
     } 
    ], 
    "status": "INVALID_ARGUMENT" 
    } 
} 

を持っていたBigQueryにアクセスできなかったとき、私はページ

https://cloud.google.com/bigquery/docs/reference/datatransfer/rest/v1/projects.transferConfigs/create 

からこのエラーが発生しました。 私はサービスアカウントを使用し、dataSourceと転送を一覧表示できますが、データ転送は作成できません。

あなたは何が間違っていると言うことができますか? Googleでは、認可およびアクセスを提供した後

作業コード

$this->client = new Google_Client(); 
$this->client->useApplicationDefaultCredentials(); 
$this->client->setAuthConfig('client_secret.json'); 
$this->client->setAccessType("offline"); 
$this->client->setIncludeGrantedScopes(true); 
$this->client->setScopes(array(
     Google_Service_Bigquery::BIGQUERY, 
     ADWORDS_SCOPE 
    ) 
); 
$this->client->setRedirectUri(self::REDIRECT_URI); 
$url = $this->getAuthUrl(); 
header('Location: ' . filter_var($url, FILTER_SANITIZE_URL)); 

。 は私が

$this->client = new Google_Client(); 
$this->client->useApplicationDefaultCredentials(); 
$this->client->setAuthConfig(MCC_DIR . 'protected/config/client_secret.json'); 
$this->client->setAccessType("offline"); 
$this->client->setIncludeGrantedScopes(true); 
$this->client->setScopes(array(
     Google_Service_Bigquery::BIGQUERY, 
     ADWORDS_SCOPE 
    ) 
); 
$this->client->setRedirectUri(self::REDIRECT_URI); 
$code = $_GET['code']; 
$this->client->authenticate($code); 
$tokken = $this->client->getAccessToken(); 
$this->client->setAccessToken($tokken); 
$this->service = new Google_Service_BigQueryDataTransfer($this->client); 
$this->service->projects_locations_dataSources->checkValidCreds(
    'projects/1069829667403/locations/europe/dataSources/adwords', 
    new Google_Service_BigQueryDataTransfer_CheckValidCredsRequest() 
); 

をコーディングするためにリダイレクトすると、すべてのデフォルトアプリケーションの資格情報が($response->hasValidCredstrueでない限り、credsをが無効であることに注意してください)BugQuery TransferConfigサービスを使用するには不十分である

答えて

0

リグコード。

  1. 他のタイプのOAuthクライアントIDを作成する必要があります。
  2. jsonをダウンロードしてください。
  3. get refresh tokken。

    のconst BQ_API_SCOPE = Google_Service_Bigquery :: BigQueryの。」 '.Google_Service_Bigquery :: CLOUD_PLATFORM; const REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'; ....

    $scopes = self::BQ_API_SCOPE; 
    $oauth2 = new OAuth2([ 
         'authorizationUri' => self::AUTHORIZATION_URI, 
         'redirectUri' => self::REDIRECT_URI, 
         'tokenCredentialUri' => CredentialsLoader::TOKEN_CREDENTIAL_URI, 
         'clientId' => $clientId, 
         'clientSecret' => $clientSecret, 
         'scope' => $scopes 
        ]); 
    
    echo $oauth2->buildFullAuthorizationUri(); 
    
    $stdin = fopen('php://stdin', 'r'); 
    print'After approving the application, enter the authorization code here: '; 
    $code = trim(fgets($stdin)); 
    fclose($stdin); 
    print "\n";   
    $oauth2->setCode($code); 
    $authToken = $oauth2->fetchAuthToken();   
    printf("Your refresh token is: %s\n\n", $authToken['refresh_token']); 
    
  4. )(3

    $クライアント=新しいGoogle_ClientからGoogleのクライアントの利用REFRESH_TOKKENでサービスを作成します。 $ client-> setAuthConfig( 'client_secret.json'); $ client-> setAccessType( "offline"); $ client-> setIncludeGrantedScopes(true); ます。$ client-> setScopes(配列( Google_Service_Bigquery :: BigQueryの、 Google_Service_Bigquery :: CLOUD_PLATFORM、 Google_Service_Bigquery :: CLOUD_PLATFORM_READ_ONLY ) )。 IF(file_exists(自己:: ACCESS_TOKKEN_FILE)){ $ tokken =のfile_get_contents(自己:: ACCESS_TOKKEN_FILE)。 $ client-> setAccessToken($ tokken); if($ client-> isAccessTokenExpired()){ $ tokken = $ client-> fetchAccessTokenWithRefreshToken(REFRESH_TOKKEN); ますfile_put_contents(自己:: ACCESS_TOKKEN_FILE、json_encode($ tokken)); }}他{ $ tokken = $クライアント - > fetchAccessTokenWithRefreshToken(REFRESH_TOKKEN)。 ますfile_put_contents(自己:: ACCESS_TOKKEN_FILE、json_encode($ tokken)); } ます$ this->サービス=新しいGoogle_Service_BigQueryDataTransfer($クライアント)。

関連する問題