如何在dj-rest-auth中自定义邮箱验证邮件以适配移动应用场景
解决方案
dj-rest-auth的邮件验证逻辑底层依赖django-allauth的账户验证模块,你可以通过两种途径拿到单独的token注入模板:
方案1:覆写邮箱确认的邮件发送适配器(最推荐,改动最小)
- django-allauth默认使用
DefaultAccountAdapter处理邮件发送逻辑,你可以自定义继承该类的适配器,重写send_confirmation_mail方法,把token单独拆出来传给模板上下文 - 操作步骤:
- 在你的Django应用下新建
adapters.py,写入以下代码:
- 在你的Django应用下新建
from allauth.account.adapter import DefaultAccountAdapter from allauth.account.utils import user_pk_to_url_str class CustomAccountAdapter(DefaultAccountAdapter): def send_confirmation_mail(self, request, emailconfirmation, signup): activate_url = self.get_email_confirmation_url(request, emailconfirmation) # 单独提取验证token和用户ID注入上下文 ctx = { "user": emailconfirmation.email_address.user, "activate_url": activate_url, "key": emailconfirmation.key, # 这个就是你需要的独立验证token "user_id": user_pk_to_url_str(emailconfirmation.email_address.user), "signup": signup, } # 邮件发送逻辑保持原生逻辑不变 if signup: email_template = "account/email/email_confirmation_signup" else: email_template = "account/email/email_confirmation" self.send_mail(email_template, emailconfirmation.email_address.email, ctx)
- 在
settings.py中注册自定义适配器,添加配置:
ACCOUNT_ADAPTER = '你的应用名.adapters.CustomAccountAdapter'
- 之后你在自定义的
email_confirmation_message.txt模板里就可以直接调用{{ key }}变量拿到单独的验证token,直接展示给用户即可。
方案2:从默认激活链接截取token(临时应急方案)
- 如果你暂时不想修改后端逻辑,可以直接在Django模板中用过滤器截取
active_url的末尾字段,默认激活链接的格式为域名/验证路径/<token>/,模板写法参考:
{% with token=activate_url|split:'/'|last %} 你的邮箱验证令牌是:{{ token }} {% endwith %}
注意该方案依赖激活链接的路径格式不发生变化,如果后续调整了验证接口路由规则会失效,不推荐长期使用
配套验证逻辑说明
你需要给移动端提供对应的邮箱验证接口,接收用户输入的key和用户标识(邮箱/用户ID),调用dj-rest-auth原生的验证逻辑即可完成校验,原生验证接口本身就支持单独传token参数校验,不需要修改核心验证逻辑。
内容的提问来源于stack exchange,提问作者Nikos
相关产品推荐
相关产品推荐

