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

使用requests_oauthlib做OAuth2令牌交换时遇重定向URI不匹配错误

解决OAuth2授权码交换中的重定向URI不匹配问题

看起来你卡在了OAuth2服务端到服务端的令牌交换环节,虽然已经确认了重定向URI的配置,但还是遇到了匹配错误。结合你的代码和错误栈,我整理了几个关键的修复点:

1. 修复回调URL中的转义字符问题

注意到你提到的redirect_response里用了&而不是原始的&符号(比如http://localhost:8888/callback?code=123456&state=SomeStateCode),这是HTML转义后的结果。OAuth2服务端会把这个转义后的URI和你配置的http://localhost:8888/callback做严格匹配,自然会判定为不一致。

修改callback函数里的redirect_response生成逻辑:

def callback(request):
    # 把HTML转义的&替换回原始的&
    redirect_response = request.build_absolute_uri().replace('&', '&')
    state = session.get('oauth_state')
    # 这里一定要传入redirect_uri,和授权阶段保持一致
    laas = OAuth2Session(client_id, state=state, redirect_uri=redirect_uri)
    token = laas.fetch_token(
        token_url, 
        client_secret=client_secret, 
        authorization_response=redirect_response
    )
    session['oauth_token'] = token
    return HttpResponseRedirect(reverse('app:profile'))

2. 确保OAuth2Session初始化时始终传入redirect_uri

你在index函数里初始化OAuth2Session时传了redirect_uri,但在callback里的初始化漏掉了这个参数。这会导致requests_oauthlib无法正确关联授权阶段使用的重定向URI,进而引发匹配错误。务必在两次初始化时都明确传入这个参数,保持完全一致。

3. 强化State参数的校验(可选但推荐)

为了避免CSRF问题,建议在callback里先校验请求中的state和session保存的state是否一致:

def callback(request):
    request_state = request.GET.get('state')
    session_state = session.get('oauth_state')
    
    if not session_state or session_state != request_state:
        return HttpResponse("Invalid state parameter", status=400)
    
    # 后续的令牌交换逻辑...

4. 再次核对服务端的Redirect URI配置

最后再确认一遍提供者数据库里的Redirect URI:

  • 有没有末尾的斜杠?比如http://localhost:8888/callback和http://localhost:8888/callback/是两个不同的URI
  • 协议(http/https)、端口号是否和代码里的完全一致
  • 有没有多余的空格或特殊字符

另外,你设置的OAUTHLIB_INSECURE_TRANSPORT=1在开发环境是没问题的,生产环境记得切换到HTTPS。

试一下这些修改,应该就能解决这个匹配错误了。

内容的提问来源于stack exchange,提问作者Martin Reguly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:49:48