如何通过Python HTTP请求获取Google OAuth 2.0 Playground授权码
问题原因分析
- 你对OAuth 2.0授权码流程的核心逻辑理解有误:第一步构造的授权URL不是用来直接发送GET请求获取授权码的,这个地址需要用户在浏览器中打开、完成Google账号登录、同意授权操作后,Google才会将授权码附加在你设置的
redirect_uri参数中返回。你直接用requests.get请求该地址得到的是Google登录页面的HTML内容,把这个响应对象当作授权码传入后续请求,自然会触发「Malformed auth code.」报错。 - 代码中直接把
requests.get返回的响应对象赋值给authorization_code,没有提取任何有效参数,传入POST请求的根本不是字符串格式的合法授权码,格式完全不符合Google接口要求。
解决方案
方案1:配合Google OAuth 2.0 Playground快速验证
- 把你构造的
authorization_redirect_url直接复制到浏览器打开,登录你的Google账号并同意授权,之后页面会跳转到OAuth Playground,地址栏中可以看到code=xxx格式的参数,复制=后面的内容就是合法的授权码。 - 将代码中的
authorization_code值替换为你复制的授权码字符串,再运行POST请求即可正常获取access token。
方案2:Python代码自动完成完整授权流程
如果不想手动复制授权码,可以调整逻辑自动捕获回调地址返回的授权码:
- 先将
redirect_uri修改为http://localhost:空闲端口,比如http://localhost:8080,这个地址必须和你在Google Cloud后台创建OAuth凭证时填写的回调地址完全一致。 - 代码中启动一个简易的本地HTTP服务监听对应端口,用户在浏览器完成授权后,Google会将请求转发到本地服务,直接从请求参数中提取
code的值即可。
修正后的核心代码示例
import requests from flask import Flask, request app = Flask(__name__) auth_url = "https://accounts.google.com/o/oauth2/auth" access_token_url = "https://oauth2.googleapis.com/token" # 注意必须和Google Cloud后台配置的回调地址完全一致 callback_url = "http://localhost:8080" client_id = '替换为你的client_id' client_secret = '替换为你的client_secret' # 第一步:输出授权地址,提示用户点击完成授权 authorization_redirect_url = f"{auth_url}?response_type=code&client_id={client_id}&redirect_uri={callback_url}&scope=openid&access_type=offline" print(f"请打开以下地址完成授权:{authorization_redirect_url}") # 第二步:本地服务监听回调,自动提取授权码换access token @app.route('/') def get_auth_code(): authorization_code = request.args.get('code') data = { 'grant_type': 'authorization_code', 'code': authorization_code, 'redirect_uri': callback_url, 'client_id': client_id, 'client_secret': client_secret } access_token_response = requests.post(access_token_url, data=data) return access_token_response.json() if __name__ == '__main__': app.run(port=8080, debug=False)
注意事项
- 授权码是一次性凭证,使用一次后就会失效,不可重复提交。
- 授权码有效期极短,仅有几分钟,获取后需要尽快发起兑换access token的请求。
- 所有请求中的
redirect_uri参数必须和你申请Client ID时配置的地址完全一致,包括协议、端口、末尾斜杠都不能有差异。
内容的提问来源于stack exchange,提问作者Juliano Medeiros
相关产品推荐
相关产品推荐

