绕过注册表单使用allauth

11
有没有人知道如何在使用django allauth时绕过社交账户注册页面?
我已经成功实现了与Google的身份验证,但是当用户接受来自Google的请求时,它将重定向到一个页面,在该页面中要求他们输入电子邮件地址才能登录。
但是它肯定已经从Google登录中检索到了这些信息,因此应该能够简单地登录用户,以便他们可以使用该网站,是吗?
我该怎么做呢?
谢谢。

1
顺便提一下,我将SOCIALACCOUNT_AUTO_SIGNUP设置为True(默认值)。 - bodger
4个回答

8

简单的解决方法是添加:

SOCIALACCOUNT_LOGIN_ON_GET=True

将以下代码添加到您的settings.py中,就可以跳过/绕过注册表单。


8

如果你将用户重定向到

{% provider_login_url 'google' %}

并且 allauth 会向用户显示一个中间页面,其中包含以下内容:

您即将使用来自 Google 的第三方帐户登录。

当没有其他与相同电子邮件地址关联的用户时,您需要添加此配置以跳过中间页面:

SOCIALACCOUNT_LOGIN_ON_GET=True

这是在0.47.0版本中添加的,原因是由于更改说明中描述的潜在漏洞:

通过简单的重定向("/accounts/facebook/login/")自动将用户登录到他们的帐户并连接其他第三方帐户可能导致意外结果,并且在从恶意网站触发重定向时可能成为安全问题。例如,如果攻击者准备了一个恶意网站,利用Facebook密码恢复机制首先登录到自己的Facebook帐户,然后重定向到连接新的社交帐户,那么你可能会发现攻击者的Facebook帐户被添加到受害者的帐户中。为了缓解这个问题,引入了SOCIALACCOUNT_LOGIN_ON_GET。

我意识到这回答了一个稍微不同的问题,因为在这种情况下用户没有确认电子邮件,但它与之相关,因为用户仍然没有直接注册/登录。


1
啊,好的。一直在寻找答案。 - Kwaku Biney

3

这是一个旧问题,许多人都看过,但今天我也遇到了同样的问题,所以我想分享我的解决方案。

解决这个问题的关键是遵循 django-allauth 的“高级用法”文档,使用自定义重定向示例中提供的方法: https://django-allauth.readthedocs.io/en/latest/advanced.html#custom-redirects

除此之外,在这种情况下,你需要在 settings.py 中配置 SOCIALACCOUNT_ADAPTER ,并使用 DefaultSocialAccountAdapter 的子类覆盖 'pre_social_login' 方法,代码如下:

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from django.conf import settings
from django.contrib.auth import get_user_model

User = get_user_model()


class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
    """
    Override the DefaultSocialAccountAdapter from allauth in order to associate
    the social account with a matching User automatically, skipping the email
    confirm form and existing email error
    """
    def pre_social_login(self, request, sociallogin):
        user = User.objects.filter(email=sociallogin.user.email).first()
        if user and not sociallogin.is_existing:
            sociallogin.connect(request, user)

'

'pre_social_login'的文档不是很详细,但在源代码中有一个帮助文本字符串: https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/adapter.py

'

-2

您需要在SOCIALACCOUNT_PROVIDERS设置中明确定义谷歌的“电子邮件”范围

'google': { 'SCOPE': ['https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email'],
            'AUTH_PARAMS': { 'access_type': 'online' },
}

这个答案在8年前被提问时是正确的。 - james

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接