2013-03-06 55 views
5

Tôi đang sử dụng google-api-php-client 0.6.1 và tôi muốn biết có cách nào để mạo danh người dùng cụ thể bằng tài khoản dịch vụ không? Ứng dụng của tôi cần lưu trữ một số tệp trong ổ google của nó. Vì vậy, tôi đã quyết định sử dụng tài khoản dịch vụ và khóa .p12 - xác thực. Nó hoạt động tốt, nhưng tất cả các tập tin đang được lưu trữ trong tài khoản dịch vụ, vì vậy tôi không thể quản lý chúng. Tôi muốn tài liệu được lưu trữ tại tài khoản nhất định (đã được sử dụng để tạo dự án api và bản thân tài khoản dịch vụ). Tôi đã cố gắng sử dụng mã này:Mạo danh người dùng google với tài khoản dịch vụ

$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); 

nhưng tôi có "Lỗi khi làm mới token OAuth2, thông điệp: '{ "lỗi": "access_denied"}'"

+0

Tôi gặp vấn đề tương tự và có vẻ như tôi nên thực hiện một số thay đổi trong cấu hình google. Bạn đã tìm thấy giải pháp chưa? Bạn có thể chỉ cho tôi những gì tôi nên thay đổi? – Sergei

Trả lời

1

Đừng dùng $ auth- > prn, sử dụng $ auth-> sub. Điều này phù hợp với tôi:

// 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();