2012-01-20 4 views
61

Я не могу получить токен обновления с моим кодом. Я могу только получить свой маркер доступа, тип маркеров и т.д., Я следовал некоторым учебникам как положить access_type = в автономном режиме на моем URL входаПолучить токен обновления google api

echo "<a href='https://accounts.google.com/o/oauth2/auth?" 
    . "access_type=offline&client_id=123345555.apps.googleusercontent.com& " 
    . "scope=https://www.googleapis.com/auth/calendar+https://www.googleapis.com/auth/plus.me&response_type=code& " 
    . "redirect_uri=http://www.sample.com/sample.php&state=/profile'>Google</a>"; 

и мои полом в получении доступа токенов

$fields=array(
    'code'=> urlencode($authcode), 
    'client_id'=> urlencode($clientid), 
    'client_secret'=> urlencode($clientsecret), 
    'redirect_uri'=> urlencode($redirecturi), 
    'grant_type'=> 'authorization_code', 
); 

но я не могу получить refresh_token, просто access_token, token_type, id_token и expires_in.

+0

/* проверить эту ссылку, что работа для меня @Nobert решение */https://stackoverflow.com/questions/10827920/not-receiving-google-oauth-refresh-token –

ответ

88

Узнал, добавив в ваши параметры URL

approval_prompt = сила

+10

Почему он не работает с Auto? Я не хочу, чтобы пользователи каждый раз предоставляли разрешение. Как я могу это сделать? –

+5

Поскольку токен reresh возвращается только в первый раз при предоставлении разрешения на использование приложения. После этого все запросы с 'authorized_prompt = auto' больше не имеют refresh_token. Проверьте этот ответ для более подробного объяснения http://stackoverflow.com/a/10857806/987864 – Daan

+3

Вам нужно 'access_type = offline' во всех случаях, когда вы хотите refresh_token – Daan

52

Если я могу расширить ответ user987361 «s:

offline access Из части OAuth2.0 документы:

Когда ваше приложение получает токен обновления, важно сохранить этот токен обновления для будущего использования. Если ваше приложение теряет токен обновления, ему необходимо будет повторно запросить пользователя , прежде чем получить еще один токен обновления. Если вам нужно , чтобы запросить у пользователя согласие, укажите параметр approval_prompt в запросе кода авторизации и установите значение force.

Итак, когда вы уже получили доступ, последующие запросы о предоставлении grant_type из authorization_code не возвращать refresh_token, даже если access_type был установлен offline в строке запроса страницы согласия.

Как указано в приведенной выше цитате, чтобы получить новый refresh_token уже после приема одного, вам нужно будет отправить пользователя обратно через подсказку, которую вы можете сделать, установив approval_prompt в force.

Приветствия,

PS Это изменение было объявлено в blog post, а также.

+2

Я бы добавил, что вам нужно будет получить ** новый ** токен обновления, если вы его потеряете или ваш пользователь отменит ваш доступ. В противном случае вы можете использовать один и тот же токен refresh для получения новых 'toleken доступа '. – jeteon

+1

У меня есть CMS, где разные пользователи используют разные учетные записи google для подключения к аналитике api. Однако иногда несколько пользователей могут подключаться с использованием одной и той же корпоративной учетной записи google, но каждый из них хочет получить доступ к другим учетным записям Google Analytics. Только первый получает токен обновления, в то время как все остальные не имеют и, следовательно, должны повторно подключаться каждый час. Разве нет способа получить ТОЛЬКО токен обновления для последующих аутентификаций, а не только access_token, срок действия которого истекает в течение часа? – SsjCosty

+0

Да. Просто сделай это. Когда вы отправляете запрос, вы получите токен доступа и токен обновления. – bossylobster

12

Это access_type=offline что вы хотите.

Это вернет токен обновления при первом авторизации пользователем приложения. Последующие вызовы не заставляют вас повторно одобрять приложение (approval_prompt=force).

Смотрите более подробно: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

+0

В этой ссылке указано, что клиент Google позаботится о возобновлении токена доступа, когда он истечет (токен обновления, по-видимому, находится в файле секретов XML), но не показывает, как вы обнаружите, что токен доступа изменился, могут быть сохранены в приложении для следующего доступа. Есть ли обратный вызов для этого, или если приложение всегда проверяет, изменился ли токен доступа на * каждый * удаленный доступ, который он выполняет? – Jason

5

Привет я следовал следующие шаги, и я был в состоянии получить токен обновления.

Поток полномочий имеет два этапа.

  1. Необходимо получить код авторизации с использованием https://accounts.google.com/o/oauth2/auth? URL.

    Для этого отправляется почтовый запрос, содержащий следующие параметры. 'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline' Предоставление выше получит код авторизации.

  2. Извлечение AcessToken и RefreshToken с использованием https://accounts.google.com/o/oauth2/token? URL. Для этого отправляется запрос после предоставления следующих параметров.

    "код": код, "client_id": ИДС, "client_secret": CSECRET, "redirect_uri": перенаправлять "grant_type": "authorization_code",

Так что в вашем первая попытка, когда вы авторизуете разрешения, вы сможете получить токен Refresh. Последующие попытки не будут предоставлять токен обновления. Если вы хотите, чтобы токен снова отменил доступ в вашем приложении.

Надеется, что это поможет кому-то ура :)

+0

спасибо, спасибо :) – tkr

8

Это полный код в PHP с помощью Google SDK официальной

$client = new Google_Client(); 
## some need parameter 
$client->setApplicationName('your application name'); 
$client->setClientId('****************'); 
$client->setClientSecret('************'); 
$client->setRedirectUri('http://your.website.tld/complete/url2redirect'); 
$client->setScopes('https://www.googleapis.com/auth/userinfo.email'); 
## these two lines is important to get refresh token from google api 
$client->setAccessType('offline'); 
$client->setApprovalPrompt('force'); # this line is important when you revoke permission from your app, it will prompt google approval dialogue box forcefully to user to grant offline access 
+0

@Mr_Green thanks –

3

OAuth имеет два сценария в режиме реального времени. Обычный и стандартный стиль доступа называется онлайн. В некоторых случаях вашему приложению может потребоваться доступ к API Google, когда пользователь отсутствует, это автономные сценарии. токен обновления получается в автономных сценариях во время первого обмена кодами авторизации.

Таким образом, вы можете получить referh_token - это некоторые сценарии, а не все.

у вас может быть содержание в https://developers.google.com/identity/protocols/OAuth2WebServer#offline .

0

Для нашего приложения нам пришлось использовать оба этих параметра: access_type=offline&prompt=consent. approval_prompt=forceне работает для нас

Смежные вопросы