使用python 3.6,requests == 2.22.0
尝试使用Google API,尤其是mobile and desktop apps flow
我能够使用此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
部分/标签。
一旦将生成的URL粘贴到浏览器中,我将获得一个可提取并用于进行下一个调用的代码:
OAuth consent settings
输出:
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'}
并将this stack overflow post添加到上面的代码授予URL:("&prompt=consent"
)
现在我得到:
https://accounts.google.com/o/oauth2/v2/auth
我现在有刷新令牌,但这是唯一的方法吗?如果用户最终要再次通过该流程,它将强制执行另一个同意页面流程-在已经获得初始同意之后,不需要该页面。
每次没有明确同意,是否有任何方法可以获取刷新令牌?
每次没有明确同意,是否有任何方法可以获取刷新令牌?
没有在用户同意离线访问的情况下,第一次返回刷新令牌。Google假设您已经保存了它,并且在那里不需要另一个。撤消用户访问权限并再次请求访问权限,您应该获得刷新令牌。或发送请求提示将要求用户再次授予您离线访问权限,并且您将再次获得新的刷新令牌。