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

Django开发中如何获取Square重定向URL携带的OAuth授权code

Django 提取 Square OAuth 重定向授权码实现方法

Square 完成用户授权流程后,会将授权码以 URL 查询参数的形式附加到你提前配置的重定向地址上,在 Django 中不需要手动解析URL,直接通过框架封装的请求对象就能拿到参数,具体实现步骤如下:

  • 第一步:配置回调路由
    先在项目路由文件中注册OAuth回调地址,确保这个地址和你在Square开发者后台填写的重定向URI完全匹配,避免因路径不一致导致回调失败:

    # 你的app下的urls.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
        # 其余业务路由...
        path('square/callback/', views.square_oauth_callback, name='square_oauth_callback'),
    ]
    
  • 第二步:编写回调视图提取授权码
    在对应视图中直接通过request.GET读取查询参数即可,同时要兼容用户拒绝授权、参数缺失的异常场景:

    # views.py
    from django.http import HttpResponseBadRequest, HttpResponseRedirect
    from django.shortcuts import render
    
    def square_oauth_callback(request):
        # 提取授权码,Square固定用code作为参数名
        auth_code = request.GET.get('code')
        # 提取授权失败相关参数
        error = request.GET.get('error')
        error_desc = request.GET.get('error_description')
        # 如果你发起授权时传了防CSRF的state参数,先做校验
        req_state = request.GET.get('state')
        saved_state = request.session.get('square_oauth_state')
    
        # state校验不通过直接拦截
        if req_state != saved_state:
            return HttpResponseBadRequest("Invalid state parameter")
        
        # 处理授权失败场景
        if error:
            return render(request, 'oauth/error.html', {"error_msg": error_desc})
        
        # 未拿到授权码直接返回400
        if not auth_code:
            return HttpResponseBadRequest("Missing authorization code")
    
        # 到这一步就拿到了有效的auth_code,后续可以写调用接口换access_token的逻辑
        # 注意:换token的请求必须在服务端发起,不要把code传到前端,避免泄露
        
        # 流程走完后跳转到业务页面
        return HttpResponseRedirect('/user/dashboard/')
    

注意:不要手动解析request.META里的原始查询字符串拿参数,Django的request.GET已经自动完成了URL解码、多参数解析、编码兼容处理,自己写解析逻辑很容易出边界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:39:28