Google OAuth2 Python使用requests认证code参数缺失问题咨询
问题解答
关于code参数的说明
你当前报错是因为code参数留空导致的,这个参数是Google OAuth2 授权码模式下的临时授权码,获取流程如下:
- 你需要先构造Google授权页面URL,引导用户在浏览器中打开该地址,登录Google账号并同意你的应用申请的权限
- 用户同意授权后,Google会自动重定向到你预先配置的
redirect_uri,并在重定向URL的查询参数中附带code值,这个值就是你需要填入请求中的code参数,注意该授权码只能使用一次,且有效期非常短。
原生requests实现注意事项
你的现有代码有两个可优化的点:
- 不要硬编码请求头中的Cookie字段,该字段为浏览器临时生成的会话凭证,固定写入会导致请求失效,请求令牌的接口不需要手动传入Cookie
- 不推荐手动拼接表单字符串,可以直接用字典传参,requests会自动完成URL编码,避免拼写错误,示例如下:
import requests url = "https://accounts.google.com/o/oauth2/token" # 此处替换为你实际获取到的授权码 auth_code = "用户授权后获取到的code值" payload = { "grant_type": "authorization_code", "client_secret": "你的客户端密钥", "client_id": "你的客户端ID", "redirect_uri": "https://pushsistemas.com.br/", "code": auth_code } headers = { 'content-type': 'application/x-www-form-urlencoded' } response = requests.post(url, headers=headers, data=payload) print(response.json())
请求成功后你会拿到access_token和refresh_token,后续调用API时在请求头中携带Authorization: Bearer <access_token>即可。
官方推荐实现方案(使用Google官方SDK)
更推荐使用Google官方提供的认证库完成流程,不需要自己处理授权、令牌刷新等逻辑,使用步骤如下:
- 安装依赖库
pip install google-auth google-auth-oauthlib google-api-python-client
- 示例代码
from google_auth_oauthlib.flow import Flow # 替换为你自己的API权限范围 SCOPES = ['https://www.googleapis.com/auth/calendar'] # 替换为你的客户端配置,也可以直接从Google Cloud控制台下载json配置文件读取 CLIENT_CONFIG = { "web": { "client_id": "你的客户端ID", "client_secret": "你的客户端密钥", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "redirect_uris": ["https://pushsistemas.com.br/"] } } # 初始化授权流 flow = Flow.from_client_config(CLIENT_CONFIG, scopes=SCOPES) flow.redirect_uri = CLIENT_CONFIG['web']['redirect_uris'][0] # 生成授权URL,引导用户访问 authorization_url, state = flow.authorization_url(access_type='offline', include_granted_scopes='true') print(f"请访问该地址完成授权:{authorization_url}") # 用户授权后,将重定向后的完整回调URL传入即可自动兑换令牌 callback_response_url = "用户授权后浏览器地址栏的完整URL" flow.fetch_token(authorization_response=callback_response_url) # 获取凭证后即可直接调用对应API credentials = flow.credentials print(f"Access Token: {credentials.token}") print(f"Refresh Token: {credentials.refresh_token}")
内容的提问来源于stack exchange,提问作者Adilmar Coelho Dantas
相关产品推荐
相关产品推荐

