使用Flask请求Twitter OAuth2 Token端点遇页面不可用问题求助
问题解决步骤
修正Basic Auth编码错误
你当前用str(base64.b64encode(...))会把bytes对象转成带b'...'的字符串,这会导致Authorization头格式完全无效。正确的做法是用.decode('utf-8')将bytes解码为纯字符串:auth_str = base64.b64encode(f"{CLIENT_ID}:{CLIENT_SECRET}".encode('utf-8')).decode('utf-8')将请求参数移至请求体
Twitter的令牌接口要求application/x-www-form-urlencoded格式的参数放在请求体中,而非URL参数(params)里。修改requests.post的参数传递方式:r = requests.post( "https://api.twitter.com/2/oauth2/token", data=dict( # 这里用data而非params code=args["code"], grant_type="authorization_code", redirect_uri="http://localhost:5000/redirect", code_verifier=YOUR_CODE_VERIFIER, # 替换成授权时生成的code_verifier ), headers={ "Content-Type": "application/x-www-form-urlencoded", "Authorization": f'Basic {auth_str}', }, )确保code_verifier与授权请求一致
不能硬写"challenge",code_verifier必须是你在发起授权重定向到Twitter时生成的随机字符串,并且用它生成对应的code_challenge(通过S256哈希)。如果这对值不匹配,令牌请求必然失败。检查基础配置
- 确认
CLIENT_ID和CLIENT_SECRET是Twitter开发者后台对应项目的正确值 - 确认
redirect_uri和开发者后台配置的回调地址完全一致(包括协议、端口、路径)
- 确认
修正后的完整示例代码:
import base64 import requests from flask import Flask, request app = Flask(__name__) CLIENT_ID = "你的客户端ID" CLIENT_SECRET = "你的客户端密钥" # 注意:此处code_verifier需和首页路由生成的保持一致 CODE_VERIFIER = "你之前生成的随机code_verifier字符串" @app.route("/redirect", methods=["GET"]) def redir(): args = request.args # 正确编码Basic Auth字符串 auth_str = base64.b64encode(f"{CLIENT_ID}:{CLIENT_SECRET}".encode('utf-8')).decode('utf-8') r = requests.post( "https://api.twitter.com/2/oauth2/token", data=dict( code=args["code"], grant_type="authorization_code", redirect_uri="http://localhost:5000/redirect", code_verifier=CODE_VERIFIER, ), headers={ "Content-Type": "application/x-www-form-urlencoded", "Authorization": f'Basic {auth_str}', }, ) # 打印状态码辅助调试 print(f"响应状态码: {r.status_code}") return r.text
内容的提问来源于stack exchange,提问作者jan-seins
相关产品推荐
相关产品推荐

