如何通过Django URL配置获取浏览器重定向URI中的OAuth授权码
问题原因
Django的路由匹配逻辑只会匹配URL的路径部分,不会匹配?后面的查询字符串参数,你当前配置的/sales/oauth/callback路由本身是完全可以匹配/sales/oauth/callback?code=xxx这类请求的,出现匹配不到的问题优先排查以下几个常见原因:
- 重定向URI端口和Django服务启动端口不一致:你示例中填写的重定向地址是
http://localhost:3000/sales/oauth/callback,Django默认启动端口为8000,若没有特意修改端口配置,会出现端口不匹配导致404 - 路由层级配置错误:检查当前回调路由是否放在了根路由文件,还是被嵌套在带前缀的子路由中,路径要和重定向URI的路径完全对应
- 末尾斜杠问题:Django默认开启
APPEND_SLASH配置,如果你的重定向URI路径末尾带斜杠(/sales/oauth/callback/)但路由配置没加,也会触发302跳转导致匹配异常,建议路由配置和重定向URI的路径格式保持完全一致
正确获取授权码的实现
路由配置(不需要额外修改,保持现有配置即可)
urlpatterns = [ path( "sales/oauth/callback", OAuthCallbackView.as_view(), name="OAuthCallbackView", ), ]
视图层优化实现
不要直接用request.GET["code"]的方式取值,OAuth授权失败时平台只会返回error参数不会返回code,直接索引会抛出KeyError异常,建议做容错处理:
class OAuthCallbackView(APIView): def get(self, request): # 安全获取授权码 access_code = request.GET.get("code") if not access_code: # 处理授权失败的逻辑,比如获取错误信息返回提示 error_msg = request.GET.get("error", "授权过程异常") return Response({"error": error_msg}, status=400) # 后续拿code换access_token的逻辑 # ...
内容的提问来源于stack exchange,提问作者R_M_R
相关产品推荐
相关产品推荐

