Использование 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'}
У меня есть токен обновления, но это единственный способ? Если пользователь в конечном итоге снова проходит через поток, это вызовет другой поток страниц с согласием, который не требуется после получения первоначального согласия.
Можно ли каждый раз получать токен обновления без явного согласия?