Для потока API Google требуется согласие на обновление маркера каждый раз - PullRequest
0 голосов
/ 07 октября 2019

Использование python 3.6, запросы == 2.22.0

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

Я могу создатькод авторизации с использованием этого URL:

url = (
    'https://accounts.google.com/o/oauth2/v2/auth?'
    'scope={scope}'
    'response_type=code&'
    'redirect_uri={redirect_uri}&'
    'client_id={client_id}&'
    'access_type=offline'.format(
        redirect_uri=redirect_uri,
        client_id=client_id,
        scope=scope,
    )
)

Я использую redirect_uri (на данный момент) просто https://google.com, и он зарегистрирован в сгенерированном мной приложении разработчика, в разделе Authorized redirect URIs and в разделе Authorized domains на странице / вкладке OAuth consent settings.

Как только я вставляю созданный URL в браузер - я получаю код, который можно извлечь и использовать для следующего вызова:

data = {
    'client_id': client_id,
    'client_secret': client_secret,
    'grant_type': 'authorization_code',
    'code': code,
    'redirect_uri': redirect_uri,
}
url = 'https://oauth2.googleapis.com/token'

response = requests.post(
    url,
    data=data,
    headers={
        'Content-Type': 'application/x-www-form-urlencoded',
    },

print(response)
print(response.json())

Вывод:

<Response [200]>
{tokens dictionary} <-- more downstream

Вот вопрос:
В начале я экспериментировал с основными областями применения из различных примеров, доступных повсюду: email+profile, и результат, который я получил, был следующим:

{'access_token': '******', 'expires_in': 3594, 'scope': 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile openid', 'token_type': 'Bearer', 'id_token': '******'} <-- id_token is a JWT

Затем я добавил нужные мне области (и добавил их в приложение для разработчиков):

https://www.googleapis.com/auth/calendar.events+https://www.googleapis.com/auth/calendar.readonly

Результат, который я получаю, таков:

{'access_token': '******', 'expires_in': 3595, 'scope': 'https://www.googleapis.com/auth/calendar.events https://www.googleapis.com/auth/calendar.readonly', 'token_type': 'Bearer'}

Нет токена обновления? (Я специально требую, чтобы он обновил токен доступа)

Затем я прочитал этот пост переполнения стека и добавил "&prompt=consent" к URL-адресу предоставления кода выше: (https://accounts.google.com/o/oauth2/v2/auth)

Теперь я получаю:

{'access_token': '******', 'expires_in': 3600, 'refresh_token': '******', 'scope': 'https://www.googleapis.com/auth/calendar.events https://www.googleapis.com/auth/calendar.readonly', 'token_type': 'Bearer'}

У меня есть токен обновления, но это единственный способ? Если пользователь в конечном итоге снова проходит через поток, это вызовет другой поток страниц с согласием, который не требуется после получения первоначального согласия.

Можно ли каждый раз получать токен обновления без явного согласия?

1 Ответ

1 голос
/ 07 октября 2019

Можно ли каждый раз получать токен обновления без явного согласия?

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

...