API Календаря Google v3 - Как получить токен обновления (Python) - PullRequest
18 голосов
/ 17 декабря 2011

Я пытаюсь написать приложение Django, которое создает события в определенном календаре Google.До сих пор я был успешным.Есть только небольшая проблема:

Я не знаю, как получить токен обновления с клиентом Google Python.

В результате после истечения срока действия моего токенаприложение не работает, и я должен создать новый токен.Если я правильно понимаю документацию, вот тут-то и появляется токен обновления .

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

Документация Google (см. «Основные действия», раздел 4)

Мой код

import gflags
import httplib2

from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run

FLAGS = gflags.FLAGS

FLOW = OAuth2WebServerFlow(
    client_id=GOOGLE_API_CLIENT_ID,
    client_secret=GOOGLE_API_CLIENT_SECRET,
    scope=GOOGLE_API_CALENDAR_SCOPE,
    user_agent=GOOGLE_API_USER_AGENT)

storage = Storage(GOOGLE_API_CREDENTIAL_PATH)
credentials = storage.get()
if credentials is None or credentials.invalid == True:
  credentials = run(FLOW, storage)

http = httplib2.Http()
http = credentials.authorize(http)

service = build(serviceName='calendar', version='v3', http=http,
   developerKey=GOOGLE_API_DEVELOPER_KEY)

event = {
    [... Dictionary with all the necessary data here ...]
}

created_event = service.events().insert(calendarId=GOOGLE_API_CALENDAR_ID, body=event).execute()

Это в значительной степени пример из документации Google.Интересным является Storage .Это файл, в котором сохраняются некоторые учетные данные.

Содержимое файла моего хранилища:

{
    "_module": "oauth2client.client", 
    "_class": "OAuth2Credentials", 
    "access_token": [redacted], 
    "token_uri": "https://accounts.google.com/o/oauth2/token", 
    "invalid": true, 
    "client_id": [redacted], 
    "client_secret": [redacted], 
    "token_expiry": "2011-12-17T16:44:15Z", 
    "refresh_token": null, 
    "user_agent": [redacted]
}

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

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

Ответы [ 4 ]

19 голосов
/ 18 декабря 2011

Я не знаю, как это сделать с помощью Python Client или Calendar API (я просто использую библиотеку ruby ​​OAuth2 для доступа к API контактов), но я обнаружил, что мне нужно запросить «автономный» доступ у пользователь.

Это делается путем добавления параметра «access_type» со значением «offline» в URL авторизации (тот, на который вы перенаправляете пользователя, чтобы нажать «Я хочу, чтобы это приложение получило мои данные»).

Если вы сделаете это, вы получите ответ refresh_token в своем ответе JSON, когда спросите Google о токенах доступа. В противном случае вы получите только токен доступа (действительный в течение часа).

Это требование, по-видимому, было добавлено недавно (и не может быть замечательно задокументировано).

Раньше вы получали токен обновления без специального разрешения «офлайн».

Надеюсь, это направит вас в правильном направлении.

14 голосов
/ 12 января 2013

Так что, если вы уже приняли согласие без установки access_type='offline', вам нужно заставить пользователя дать согласие на ваше приложение с автономным доступом, также передав approval_prompt='force'.

self.flow = OAuth2WebServerFlow(
    client_id=self.client_id,
    client_secret=self.client_secret,
    scope=self.SCOPE,
    user_agent=user_agent,
    redirect_uri='urn:ietf:wg:oauth:2.0:oob',
    access_type='offline', # This is the default
    approval_prompt='force'
)

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

4 голосов
/ 16 июня 2017

Ответы устарели на 2017-06-16 .

  • approval_prompt устарела
  • prompt=force недействительно

Вот рабочий пример:

from oauth2client.client import OAuth2WebServerFlow

flow = OAuth2WebServerFlow(
    client_id=CLIEN_ID,
    client_secret=CLIENT_SECRET,
    scope=SCOPES,
    redirect_uri='http://localhost/gdrive_auth',
    access_type='offline',
    prompt='consent',
)

print(flow.step1_get_authorize_url())
0 голосов
/ 18 августа 2018

Если вы следуете этому руководству https://developers.google.com/identity/protocols/OAuth2WebServer и не можете получить refresh_token , попробуйте добавить prompt = 'согласие' здесь:

authorization_url, state = flow.authorization_url(
    # Enable offline access so that you can refresh an access token without
    # re-prompting the user for permission. Recommended for web server apps.
    access_type='offline',
    prompt='consent',
    # Enable incremental authorization. Recommended as a best practice.
    include_granted_scopes='true')

Здесь описано, почему это может произойти

...