如何在drf-social-oauth2登录响应中返回User模型数据
默认/auth/convert-token接口来自依赖库django-oauth-toolkit,原生仅返回令牌相关字段,要追加用户模型字段,直接自定义视图覆盖默认响应逻辑即可,操作步骤如下:
- 编写自定义ConvertToken视图
在业务app的views.py中新增以下代码,继承原生TokenView,登录成功后把用户信息插入响应体:
import json from django.contrib.auth import get_user_model from oauth2_provider.models import AccessToken from oauth2_provider.views.base import TokenView User = get_user_model() class CustomConvertTokenView(TokenView): def post(self, request, *args, **kwargs): response = super().post(request, *args, **kwargs) if response.status_code == 200: token_data = json.loads(response.content) # 用返回的access_token查关联用户,select_related减少数据库查询 access_token = AccessToken.objects.select_related("user").get(token=token_data["access_token"]) user = access_token.user # 按需配置要返回的用户字段,不要返回密码、权限标记等敏感信息 token_data["user"] = { "id": user.id, "username": user.username, "email": user.email, # 自定义用户字段直接加就行,比如昵称、头像 # "nickname": user.nickname, # "avatar": user.avatar.url if user.avatar else "" } response.content = json.dumps(token_data) return response
- 覆盖默认路由
打开项目根urls.py,把自定义视图的路由放在drf-social-oauth2路由的前面,替换原生convert-token接口:
from django.urls import path, include from .views import CustomConvertTokenView urlpatterns = [ # 自定义路由必须放最前面,不然会被默认路由拦截 path("auth/convert-token", CustomConvertTokenView.as_view(), name="convert-token"), path("auth/", include("drf_social_oauth2.urls", namespace="drf")), # 其他原有路由不动 ]
替代方案
不想改oauth2核心逻辑的话,也可以单独写个/auth/me接口,校验请求头里的Bearer令牌,返回当前登录用户信息。前端拿到access_token之后,多打一次请求拉用户数据就行,缺点是多一次HTTP请求。
踩坑提醒
- 别返回敏感字段,密码哈希、is_superuser、支付相关的用户隐私字段一律不要放在响应里
- 路由顺序不能乱,Django按从上到下的顺序匹配,自定义路由放后面的话改了也不生效
- 关联表的数据比如用户扩展profile表的内容,也可以正常查出来序列化返回,和普通接口写法没区别
内容的提问来源于stack exchange,提问作者Milanor
相关产品推荐
相关产品推荐

