You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:50:36