Отримати маркер оновлення google api


79

Я не можу отримати свій маркер оновлення зі своїм кодом. Я можу отримати лише свій маркер доступу, тип маркера тощо, я дотримувався деяких підручників, таких як розміщення access_type=offlineмоєї URL-адреси для входу:

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 .


1
/ * Перевірити це посилання , що робота для мене @Nobert рішення * / stackoverflow.com/questions/10827920 / ...
Manmeet Khurana

Відповіді:


109

Це з’ясувалося, додавши це до параметрів URL-адреси

Approval_prompt = сила

Оновлення:

Використовуйте access_type=offline&prompt=consent замість цього.

approval_prompt=forceбільше не працює https://github.com/googleapis/oauth2client/issues/453


12
Чому це не працює з Auto? я не хочу, щоб користувачі щоразу надавали дозвіл. Як я можу прийти до цього?
Харша М. В.

6
Оскільки маркер оновлення повертається лише вперше після надання дозволу додатку. Після цього всі запити з уже approval_prompt=autoне мають update_token. Перевірте цю відповідь для більш детального пояснення stackoverflow.com/a/10857806/987864
Даан

4
Вам потрібно access_type=offlineу всіх випадках, коли ви хочете refresh_token
Daan

7
Відредагована відповідь на щось, що працює, оскільки ця відповідь застаріла і більше не працює. Я витратив значний час, намагаючись це зробити, оскільки є кілька місць, де кажуть, що слід використовувати цей метод. Нарешті я прочитав документацію (яку я мав би зробити першою), і там написано, що ви повинні використовувати її prompt=consent. Довідково: developers.google.com/identity/protocols/…
Goblinlord

9
І @Daan, і @Goblinlord правильні, я боровся з цим, навіть прочитавши їхні коментарі. Насправді нам потрібно ОБОХ access_type=offline&prompt=consent. Інакше refresh_tokenне буде присутній.
Noitidart

62

Якщо я можу розширити відповідь користувача 987361 :

З частини автономного доступу в документах OAuth2.0:

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

Отже, коли ви вже отримали доступ, наступні запити для а grant_typeз authorization_codeне повернути refresh_token, навіть якщо access_typeбув встановленийoffline в рядку запиту сторінки згоди.

Як зазначено в цитаті вище, для того , щоб отримати новий refresh_token після того, як вже отримує один, вам потрібно буде відправити користувача назад через підказку, яку ви можете зробити, встановивши approval_promptвforce .

Ура,

PS Про цю зміну було також повідомлено у дописі в блозі .


3
Я хотів би додати, що вам потрібно буде отримати нове, лише refresh token якщо ви його втратите або користувач скасує ваш доступ. В іншому випадку ви можете продовжувати використовувати те саме refresh tokenдля отримання нових access tokens.
джетеон

1
У мене є система управління вмістом, де різні користувачі використовують різні облікові записи Google для підключення до API аналітики. Однак іноді декілька користувачів можуть підключитися за допомогою одного корпоративного облікового запису Google, але кожен хоче отримати доступ до різних облікових записів Analytics. Тільки перший отримує маркер оновлення, тоді як усі інші не отримують, і тому йому доведеться підключатися щогодини. Хіба не існує способу отримати ТІЙ самий маркер оновлення для подальшої автентифікації замість просто access_token, термін дії якого закінчується протягом години?
SsjCosty

Так. Просто зроби це. Коли ви надішлете запит, ви отримаєте маркер доступу та маркер оновлення.
bossylobster

Я з усіх сил намагався отримати refresh_token, і ви підсвітили мене рішенням !!! "Отже, коли ви вже надали доступ, наступні запити на видання_типу_авторизації_коду не повернуть оновлення_токена, навіть якщо для параметра доступу_типу було встановлено режим офлайн у рядку запиту сторінки згоди."
Крістіана С. Парада

12

Це access_type=offlineте, що ти хочеш.

Це поверне маркер оновлення, коли користувач вперше авторизує програму. Подальші дзвінки не змушують вас повторно схвалювати програму ( approval_prompt=force).

Детальніше див .: https://developers.google.com/accounts/docs/OAuth2WebServer#offline


1
На цій сторінці вказано, що клієнт Google подбає про поновлення маркера доступу, коли термін його дії закінчується (маркер оновлення, імовірно, знаходиться у файлі секретів XML), але не показує, як ви могли б виявити, що маркер доступу змінився, щоб він міг буде збережено у програмі для наступного доступу. Чи є для цього зворотний виклик, чи програма завжди повинна перевіряти, чи змінився маркер доступу на кожному віддаленому доступі, який він виконує?
Джейсон

10

Це повний код на PHP за допомогою офіційного SDK Google

$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

8

Для нашого додатку нам довелося використовувати обидва ці параметри access_type=offline&prompt=consent. approval_prompt=force не працював у нас


1
Дякую Рікі, це те, що спрацювало і на мене. Я думаю, що старіші відповіді, які припускають approval_prompt=force, на той момент були, мабуть, правильними, але вже не працюють. Тут є певна дискусія: github.com/google/oauth2client/issues/453
Mike Morearty

7

Привіт, я виконав наступні кроки, і мені вдалося отримати маркер оновлення.

Потік авторизації має два етапи.

  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-адреси. Для цього надсилається запит на публікацію із зазначенням наступних параметрів.

    "code": code, "client_id": CID, "client_secret": CSECRET, "redirect_uri": REDIRECT, "grant_type": "auth_code",

Отже, з першої спроби, як тільки ви дозволите дозволи, ви зможете отримати маркер оновлення. Подальші спроби не нададуть маркер оновлення. Якщо ви хочете, щоб маркер знову скасував доступ до вашої програми.

Сподіваюся, це допоможе комусь ура :)


5

OAuth має два сценарії в реальному режимі. Звичайний і стандартний стиль доступу називається Інтернет. У деяких випадках вашій програмі може знадобитися доступ до API Google, коли користувача немає , Це сценарії офлайн. маркер оновлення отримується в автономних сценаріях під час першого обміну кодом авторизації.

Таким чином, ви можете отримати referh_token це деякі сценарії, а не всі.

вміст можна отримати на https://developers.google.com/identity/protocols/OAuth2WebServer#offline .



0

Для тих, хто використовує клієнтську бібліотеку Google API для PHP і шукає автономний доступ та маркери оновлення, будьте обережні на момент написання цієї статті, документи містять неправильні приклади.

в даний час це показує:

$client = new Google_Client();
$client->setAuthConfig('client_secret.json');
$client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY);
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
// offline access will give you both an access and refresh token so that
// your app can refresh the access token without user interaction.
$client->setAccessType('offline');
// Using "consent" ensures that your application always receives a refresh token.
// If you are not using offline access, you can omit this.
$client->setApprovalPrompt("consent");
$client->setIncludeGrantedScopes(true);   // incremental auth

джерело: https://developers.google.com/identity/protocols/OAuth2WebServer#offline

Все це чудово працює - крім ОДНОЇ штуки

$client->setApprovalPrompt("consent");

Після невеликих міркувань я змінив цей рядок на наступний і ВСЕ РОБОТАЛ

$client->setPrompt("consent");

Це має сенс, оскільки за допомогою запитів HTTP його було змінено з утвердження_промптом = примусово на запит = згода . Отже, зміна методу встановлення з setApprovalPrompt на setPrompt дотримується природних умов - АЛЕ ЦЕ НЕ В ДОКСАХ !!! Що я принаймні знайшов.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.