Не удается получить токен автономного доступа с помощью Google PHP sdk 1.0.0

Я не могу получить токен автономного доступа с этим кодом... Почему?

$client = new Google_Client();
$client->setApplicationName('MyAppName');
$client->setScopes(array('https://www.googleapis.com/auth/plus.me'));
$client->setClientId('MyCientID');
$client->setClientSecret('MyClientSecret');
$client->setRedirectUri('http://mydomain.com/googlecallback');
$client->setApprovalPrompt('force');
$client->setAccessType('offline');
$client->setDeveloperKey('MyDeveloperKey');
$plus = new Google_Service_Plus($client);
header('Location: '.$client->createAuthUrl());

Это перенаправление на страницу входа в Google, которая запрашивает только токен доступа на 1 час... Я потерялся в темноте...

Большое спасибо!

РЕДАКТИРОВАТЬ :

вот мой код страницы входа:

$client = new Google_Client();
$client->setClientId('qvdsfvqdsf');
$client->setClientSecret('qsdfvqsdf');
$client->setRedirectUri('?a=callback');
$client->setDeveloperKey('qdcQSDCQSD');
$client->setApprovalPrompt('auto');
$client->setAccessType('offline');
$client->setScopes(array('https://www.googleapis.com/auth/plus.me'));
$plus = new Google_Service_Plus($client);

if($_GET['a'] == 'authorize'){
    header('Location: '.$client->createAuthUrl());
}
elseif($_GET['a'] == 'callback' && isset($_GET['code']) && !isset($_GET['error'])){
    $client->authenticate($_GET['code']);
    if($client->getAccessToken()){
        STORE ACCESS TOKEN
    }
}

И мое использование API:

$client = new Google_Client();
$client->setClientId('qsdfsqd');
$client->setClientSecret('qsdfqsd');
$client->setRedirectUri('qdfq');
$client->setDeveloperKey('sdfvsdf');
$client->setApprovalPrompt('auto');
$client->setAccessType('offline');
$client->setScopes(array('https://www.googleapis.com/auth/plus.me'));
$plus = new Google_Service_Plus($client);
$client->setAccessToken('STORED ACCESS TOKEN');
$activities = $plus->activities->listActivities('me', 'public', array('maxResults'=>10));

Что я делаю неправильно?


person Deptroco    schedule 08.03.2014    source источник


Ответы (3)


В качестве URI перенаправления на < href="https://console.developers.google.com/project" rel="nofollow">страница настроек приложения.

Метод $client->createAuthUrl() создает URL-адрес страницы аутентификации. После перехода на эту страницу и авторизации приложения Google перенаправит вас обратно на /googlecallback с параметром строки запроса под названием «код», который вы должны передать методу аутентификации () клиента. Только тогда у вас будет доступ к токену.

Что-то вроде этого (при условии, что это на /googlecallback):

$client = new Google_Client();

$client->setApplicationName('MyAppName');
$client->setScopes(array('https://www.googleapis.com/auth/plus.me'));
$client->setClientId('MyCientID');
$client->setClientSecret('MyClientSecret');
$client->setRedirectUri('http://mydomain.com/googlecallback');
$client->setApprovalPrompt('force');
$client->setAccessType('offline');
$client->setDeveloperKey('MyDeveloperKey');

if (empty($_GET['code'])) {
    header('Location: '.$client->createAuthUrl());
} else {
    $client->authenticate($_GET['code']);
    $access_token = $client->getAccessToken();
    // save the token somewhere so you can use later
    // without having to go to the auth page again
}
person Vinicius Pinto    schedule 08.03.2014
comment
Я уже делаю это, но это дало мне токен доступа на 1 час, я хочу постоянный токен доступа... но спасибо, вы молодцы! - person Deptroco; 08.03.2014
comment
А, ладно, извини. Но постоянного токена нет, при первом получении токена + токен обновления. Затем, после этого, новая библиотека (1.x) автоматически обновляет токен по истечении срока его действия. developers.google.com/accounts/docs/OAuth2WebServer - person Vinicius Pinto; 08.03.2014
comment
У вас есть пример? Икс) - person Deptroco; 08.03.2014
comment
Там нет дополнительного кода, тот, который я разместил, должен работать нормально. Когда пользователь впервые авторизует ваше приложение, его токен доступа будет содержать поле refresh_token. Вам не нужно ничего делать, библиотека справится с этим. Если вы не получаете токен обновления, проверьте этот вопрос stackoverflow.com/questions/10827920/ - person Vinicius Pinto; 08.03.2014
comment
Вывод getAccessToken: {access_token:random,token_type:Bearer,expires_in:3600,id_token:random,refresh_token:random,created:1394292095} Но срок его действия истекает через 1 час! я вызываю setAccessToken(), чтобы использовать API Спасибо, спасибо, спасибо!! - person Deptroco; 08.03.2014
comment
Вы, наконец, помогли мне найти ответ, большое спасибо! - person Deptroco; 09.03.2014
comment
большой! просто примечание, я сказал в предыдущем комментарии, что вам не нужно ничего делать с токеном обновления, но вам, очевидно, нужно снова сохранить его локально, иначе вы будете продолжать отправлять токен с истекшим сроком действия, и я думаю, что API ограничивает количество токенов обновления вы получаете - person Vinicius Pinto; 09.03.2014
comment
Итак, если я вас понял, через 2 часа пользователь должен быть перенаправлен на страницу входа в систему oauth? - person Deptroco; 09.03.2014
comment
Нет, вы просто отправляете сохраненный ранее токен. Ознакомьтесь с документацией: developers.google.com/accounts/docs/OAuth2WebServer. - person Vinicius Pinto; 09.03.2014
comment
Ты классный, спасибо за все твои ответы!! Я только что отредактировал свой вопрос с точным использованием API, что я делаю неправильно? Благодарность :) - person Deptroco; 09.03.2014

Наконец получил ответ:

Использование $client->setApprovalPrompt('force'); блокировало обычный процесс обновления токена Google, а $client->setApprovalPrompt('auto'); делало это как шарм.

Спасибо.

person Deptroco    schedule 09.03.2014
comment
Рад, что у вас все в порядке, но это не ответ. Была решена какая-то другая проблема, и это изменение кода — просто совпадение. - person pinoyyid; 09.03.2014

Если пользователь ранее аутентифицировался с помощью ClientID, не запрашивая автономный режим, а затем вы запрашиваете автономный режим, он не предоставит вам токен обновления.

Пользователю необходимо деавторизоваться из приложения, а затем повторно авторизоваться, как только приложение запросит автономный режим.

person Prisoner    schedule 09.03.2014