【问题标题】:Manually Invoking email verification手动调用电子邮件验证
【发布时间】:2015-11-23 17:33:37
【问题描述】:

我们在生产环境中使用 django-allauth 已经有一段时间了。我们可以启用帐户电子邮件验证,效果很好。但是我们现在有一个允许用户通过 API 注册的 REST api,并且工作流不通过 django-allauth。是否可以手动调用 django-allauth 电子邮件验证功能,还是我们需要使用自定义解决方案?

【问题讨论】:

    标签: django-allauth


    【解决方案1】:

    我将在这里发布我的答案,因为我一直在寻找使用 Django 内置身份验证(并使用自定义身份验证模型)添加电子邮件验证,我使用了 Marcus 提到的方法,我将添加所有对于任何想要做同样事情的人来说,它周围的其他东西。

    首先:按照here的描述安装django-allauth

    第二:settings.py文件中添加您的电子邮件配置:

    EMAIL_USE_TLS = True
    EMAIL_HOST = 'smtp.gmail.com' #I used gmail in my case
    EMAIL_HOST_USER = <Your Email>
    EMAIL_HOST_PASSWORD = <Your Password>
    EMAIL_PORT = 587
    DEFAULT_FROM_EMAIL = <Default Sender name and email>
    

    第三:添加验证配置和默认登录url,你会发现所有配置参数的文档here,注意在我的例子中我使用的是自定义用户模型,这就是为什么我将ACCOUNT_EMAIL_REQUIRED设置为True&ACCOUNT_USER_MODEL_USERNAME_FIELDACCOUNT_USERNAME_REQUIRED设置为False,还有LOGIN_URLACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URLLOGIN_REDIRECT_URL参数在用户点击确认后使用通过电子邮件发送给他的链接

    ACCOUNT_EMAIL_VERIFICATION='mandatory'
    ACCOUNT_CONFIRM_EMAIL_ON_GET=True
    ACCOUNT_EMAIL_REQUIRED=True
    ACCOUNT_USER_MODEL_USERNAME_FIELD = None
    ACCOUNT_USERNAME_REQUIRED = False
    ACCOUNT_AUTHENTICATION_METHOD = 'email'
    LOGIN_URL='app:login_user'
    LOGIN_REDIRECT_URL='app:login_user'
    ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL='app:login_user'
    

    第四:在你的注册表单之后,将is_active参数设置为False的用户实例保存,然后调用方法:

    from allauth.account.utils import *
    send_email_confirmation(request, user, True)
    

    最后:收到用户确认邮件后的信号,将is_active设置为True

    from allauth.account.signals import email_confirmed
    from django.dispatch import receiver
    
    # Signal sent to activate user upon confirmation
    @receiver(email_confirmed)
    def email_confirmed_(request, email_address, **kwargs):
        user = MyUser.objects.get(email=email_address.email)
        user.is_active = True
        user.save()
    

    最后,您需要更改 Django Admin 的默认站点名称,因为它将包含在发送的电子邮件中。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我找到的解决方案是从 allauth 调用原始的 send_email_confirmation 方法。我正在为我的 API 使用 DRF3。

      from allauth.account.utils import send_email_confirmation
      
      ...
      def some_view(request):
          user = ...
          ...
          #using request._request to avoid TypeError on change made in DRF3 (from HTTPRequest to Request object)
          send_email_confirmation(request._request, user)
          ...
      

      希望对你有帮助。

      【讨论】:

      • 谢谢马库斯,我试试看!
      • 我收到一条错误消息“您看到此消息是因为此站点在提交表单时需要 CSRF cookie。出于安全原因需要此 cookie,以确保您的浏览器不会被第三方劫持派对”。我正在使用带有 rest-auth 和 React 前端的令牌身份验证。这似乎与 allauth 不兼容,后者需要模板中的 CSRF 令牌。知道如何从 SPA 前端调用 send_email_confirmation 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2017-04-21
      • 2018-07-30
      • 2013-11-05
      • 2023-04-06
      • 2011-09-25
      相关资源
      最近更新 更多