如何自定义django-graphql-auth的Register mutation返回值以获取新建用户ID
解决方案
你之前的实现存在几个核心问题:未在mutation类上声明额外返回字段、没必要查询最新用户(存在并发拿错用户的风险)、返回参数拼写错误、异常处理逻辑存在漏洞,以下是可直接运行的实现:
步骤1:实现自定义Register mutation
from django_graphql_auth import mutations import graphene class RegisterCustom(mutations.Register): # 声明要额外返回的user_id字段 user_id = graphene.Int() @classmethod def mutate(cls, root, info, **kwargs): # 调用父类注册逻辑,返回结果已自带创建好的user实例、success状态、错误信息 res = super().mutate(root, info, **kwargs) # 注册失败直接返回父类结果,保留原有错误信息 if not res.success: return res # 注册成功时携带user_id返回 return cls( success=res.success, errors=res.errors, user_id=res.user.id )
步骤2:替换schema中的原有注册mutation
import graphene # 导入你上面写的RegisterCustom from your_app.mutations import RegisterCustom # 保留其他原有mutation,比如登录、token验证等 from django_graphql_auth.mutations import VerifyAccount, Login, RefreshToken class Mutation(graphene.ObjectType): # 用自定义的RegisterCustom替换原有register register = RegisterCustom.Field() verify_account = VerifyAccount.Field() login = Login.Field() refresh_token = RefreshToken.Field() schema = graphene.Schema(mutation=Mutation)
之前实现的问题说明
- 无需查询最新创建的用户:父类
mutate返回的结果中已经包含刚创建的user实例,通过res.user即可直接访问,用order_by('-date_joined')查询的方式在并发场景下会拿到其他用户的id,存在严重逻辑漏洞 - 缺少字段声明:你没有在自定义mutation类上声明
user_id字段,graphene无法识别你返回的user_id参数,就会返回空值加报错 - 拼写错误:第二次实现中你把
success拼成了sucess,导致返回参数不匹配 - 异常处理漏洞:如果父类
mutate执行报错,你代码中的res变量还未定义,直接访问res.errors会触发二次异常
内容的提问来源于stack exchange,提问作者Rafael Santos
相关产品推荐
相关产品推荐

