2015-03-23 1 views
1

Я делаю много разных вызовов api для google api, используя access_token, поэтому мне нужно обрабатывать регистр, когда access_token истек и обмениваясь refresh_token, чтобы получить новый.Каков наилучший подход к обмену refresh_token на access_token? (API Google)

Каков наилучший способ для этого?

Я предполагаю, что каждый API-вызов с try{}catch(){} блоком.

Если возникновение исключения, в блоке catch(), я сделаю еще один вызов API для проверки access_token до https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={accessToken} конечной точки.

Это, вероятно, не является хорошей идеей превратить каждый вызов API в try() catch(){} блок и дублировать логику catch().

Как я могу сделать это лучше?

P.S. Я использую библиотеку guzzle для создания вызовов API.

+0

FYI, если вы используете [Google API PHP Client] (https://github.com/google/google-api-php-client) он должен автоматически согласуют новый access_token когда уже существующий истекает. – abraham

ответ

0

Если вы используете библиотеку, предоставленную Google для совершения ваших звонков, я предлагаю вам проверить, не выполняет ли библиотека повторную попытку для вас. Библиотека Java делает это, и я подозреваю, что и библиотека Python.

Если вы не пользуетесь библиотекой, check if there would not be one available for your language. Если вам это очень поможет.

Если у вас действительно нет выбора и вы не можете использовать библиотеки Google, я предлагаю вам подражать их поведению в вашем собственном коде. Это означало бы создание своего рода поведения GoogleRequest (класс, модуль или что-то подобное в зависимости от вашего языка). Такое поведение обеспечит метод execute(), который будет обрабатывать ошибку аутентификации, обновить токен и повторить запрос.

Кстати, URL-адрес, используемый для обновления токена, не тот, который вы указали в своем вопросе. Вы должны послать POST запрос URL https://www.googleapis.com/oauth2/v3/token с этим телом:

client_secret=YOUR_CLIENT_SECRET&grant_type=refresh_token&refresh_token=YOUR_REFRESH_TOKEN&client_id=YOUR-CLIENT_ID 
+1

На данный момент библиотека Google не повторяет попытку.Он проверяет время истечения локально хранимого времени и обновляет токен, если он кажется, что он должен был истек, но если токен действительно истек, а местное время истечения времени неверно, тогда будет создано исключение. – Jason

0

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

Токен доступа хорош на 1 час. Вы можете использовать это, чтобы решить, нужно ли обновить токен доступа. Это делает библиотека Google-api-php-client.

Я действительно рекомендую вам использовать клиентскую библиотеку Google, это значительно облегчит вам работу.

+0

Чувствую себя как сталкер, но «1 час» ??? – pinoyyid

+0

Препятствуйте лучшим ответам улучшает вещи для всех. Я делаю то, что я делаю, потому что я не нашел лучшего решения, если у меня есть один, я все для улучшения кода. – DaImTo

+0

{ "access_token": "1/fFBGRNJru1FQd44AzqT3Zg", "expires_in": 3920, "token_type": "Канал", } . Используйте срок действия, а не 1 час. – pinoyyid

0

Обмен PHP-кодом легко, если вы просто используете клиентскую библиотеку API Google для PHP. От the Google+ Quickstart sample:

$client = new Google_Client(); 
$client->setApplicationName('YOUR_APP_NAME';); 
$client->setClientId('YOUR_CLIENT_ID';); 
$client->setClientSecret('YOUR_CLIENT_SECRET';); 
$client->setRedirectUri('postmessage'); 

// Code came from a POST 
$code = $request->getContent(); 

// Exchange the OAuth 2.0 authorization code for user credentials. 
$client->authenticate($code); 
$token = json_decode($client->getAccessToken());