6

Tôi đang chạy mã PHP sau, sử dụng thư viện máy khách được tìm thấy tại đây: https://code.google.com/p/google-api-php-client/. Tôi không nhận được bất kỳ lỗi nào cho bất kỳ mã nào trong số này, nhưng khi tôi gọi getAccessToken(), nó trả về giá trị rỗng.Sử dụng Tài khoản dịch vụ, getAccessToken() trả về null

Tôi đã cho phép truy cập vào tài khoản dịch vụ này trên lịch cá nhân của mình và đã cấp quyền truy cập đầy đủ vào dự án thông qua Bảng điều khiển API.

Bất kỳ ý tưởng nào?

require_once 'google-api-php-client/src/Google_Client.php'; 

const CLIENT_ID = 'blahblahblah'; 
const SERVICE_ACCOUNT_NAME = '[email protected]'; 
const KEY_FILE = 'path/to/privatekey.p12'; 

$google_client = new Google_Client(); // created only to initialized static dependencies 
$client = new Google_OAuth2(); // you really just need Google_OAuth2 

$key = file_get_contents(KEY_FILE); 

$client->setAssertionCredentials(
    new Google_AssertionCredentials(
     SERVICE_ACCOUNT_NAME, 
     array('https://www.googleapis.com/auth/calendar'), 
     $key 
    ) 
); 

var_dump($client->getAccessToken()); 

Trả lời

3

Đối với một số lý do, điều này dường như làm việc:

require_once 'google-api-php-client/src/Google_Client.php'; 

const CLIENT_ID = 'blahblahblah'; 
const SERVICE_ACCOUNT_NAME = '[email protected]'; 
const KEY_FILE = 'path/to/privatekey.p12'; 
const CALENDAR_SCOPE = "https://www.googleapis.com/auth/calendar"; 

$key = file_get_contents(KEY_FILE); 
$auth = new Google_AssertionCredentials(
    SERVICE_ACCOUNT_NAME, 
    array(CALENDAR_SCOPE), 
    $key 
); 

$client = new Google_Client(); 
$client->setScopes(array(CALENDAR_SCOPE)); 
$client->setAssertionCredentials($auth); 
$client->getAuth()->refreshTokenWithAssertion(); 
$accessToken = $client->getAccessToken(); 

$client->setClientId(CLIENT_ID); 

Nếu ai đó có thể giải thích lý do tại sao này làm việc, xin vui lòng chỉnh sửa câu trả lời này hoặc nhận xét!

+0

Bạn cũng không chắc chắn. Tôi đang sử dụng mã của bạn với tín dụng tại https://gist.github.com/fulldecent/6728257 và FYI dòng setScopes là không cần thiết –

+1

'' getAccessToken() '' trả về mã thông báo truy cập hiện tại, không tồn tại cho đến khi bạn gọi '' refreshTokenWithAssertion() '' (để khởi tạo nó) hoặc '' setAccessToken() '' (nếu bạn đã khôi phục mã thông báo truy cập trước đó bạn muốn sử dụng). – tiho