2013-03-06 13 views
5

Ich benutze google-api-php-client 0.6.1 und ich möchte wissen, gibt es eine Möglichkeit, konkreter Benutzer mit Dienstkonto zu imitieren? Meine Anwendung muss einige Dateien in ihrem Google-Laufwerk speichern. Also, ich habe entschieden, Benutzer-Service-Konto und .p12 Schlüssel - Authentifizierung. Es funktioniert gut, aber alle Dateien werden im Dienstkonto gespeichert, so dass ich sie nicht verwalten kann. Ich möchte, dass Dokumente in einem bestimmten Konto gespeichert werden (das zum Erstellen des API-Projekts und des Dienstkontos verwendet wurde). Ich habe versucht, diesen Code zu verwenden:Imitieren Sie Google-Benutzer mit einem Dienstkonto

$KEY_FILE = <p12 key file path>; 
$key = file_get_contents($KEY_FILE); 
$auth = new Google_AssertionCredentials(
     $SERVICE_ACCOUNT_NAME, 
     array('https://www.googleapis.com/auth/drive'), 
     $key); 
$auth->prn = '<[email protected]>'; 
$client = new Google_Client(); 
$client->setUseObjects(true); 
$client->setAssertionCredentials($auth); 
return new Google_DriveService($client); 

aber ich habe "Fehler Auffrischen der OAuth2 Token, Meldung: '{ "Fehler": "access_denied"}'"

+0

Ich erfahre das gleiche Problem und es scheint, dass ich einige Änderungen in Google-Konfiguration selbst vornehmen sollte. Hast du die Lösung gefunden? Kannst du mir zeigen, was ich ändern sollte? – Sergei

Antwort

1

Haben Benutzer $ auth- nicht > prn, benutze $ auth-> sub. Das funktioniert für mich:

// Create a new google client. We need this for all API access. 
$client = new Google_Client(); 
$client->setApplicationName("Google Group Test"); 

$client_id = '...'; 
$service_account_name = '...'; 
$key_file_location = '...'; 

if (isset($_SESSION['service_token'])) { 
    $client->setAccessToken($_SESSION['service_token']); 
} 
$key = file_get_contents($key_file_location); 

// https://www.googleapis.com/auth/admin.directory.group, 
// https://www.googleapis.com/auth/admin.directory.group.readonly, 
// https://www.googleapis.com/auth/admin.directory.group.member, 
// https://www.googleapis.com/auth/admin.directory.group.member.readonly, 
// https://www.googleapis.com/auth/apps.groups.settings, 
// https://www.googleapis.com/auth/books 
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name, 
     array(
      Google_Service_Groupssettings::APPS_GROUPS_SETTINGS, 
      Google_Service_Directory::ADMIN_DIRECTORY_GROUP, 
      Google_Service_Directory::ADMIN_DIRECTORY_GROUP_READONLY, 

      Google_Service_Directory::ADMIN_DIRECTORY_GROUP_MEMBER, 
      Google_Service_Directory::ADMIN_DIRECTORY_GROUP_MEMBER_READONLY, 

      Google_Service_Books::BOOKS, 
     ), 
     $key, 
     'notasecret' 
    ); 
// 
// Very important step: the service account must also declare the 
// identity (via email address) of a user with admin priviledges that 
// it would like to masquerade as. 
// 
// See: http://stackoverflow.com/questions/22772725/trouble-making-authenticated-calls-to-google-api-via-oauth 
// 
$cred->sub = '...'; 
$client->setAssertionCredentials($cred); 
if ($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion($cred); 
} 
$_SESSION['service_token'] = $client->getAccessToken(); 
Verwandte Themen