我已经成功实现了与Google的身份验证,但是当用户接受来自Google的请求时,它将重定向到一个页面,在该页面中要求他们输入电子邮件地址才能登录。
但是它肯定已经从Google登录中检索到了这些信息,因此应该能够简单地登录用户,以便他们可以使用该网站,是吗?
我该怎么做呢?
谢谢。
简单的解决方法是添加:
SOCIALACCOUNT_LOGIN_ON_GET=True
将以下代码添加到您的settings.py中,就可以跳过/绕过注册表单。
如果你将用户重定向到
{% provider_login_url 'google' %}
并且 allauth 会向用户显示一个中间页面,其中包含以下内容:
您即将使用来自 Google 的第三方帐户登录。
当没有其他与相同电子邮件地址关联的用户时,您需要添加此配置以跳过中间页面:
SOCIALACCOUNT_LOGIN_ON_GET=True
通过简单的重定向("/accounts/facebook/login/")自动将用户登录到他们的帐户并连接其他第三方帐户可能导致意外结果,并且在从恶意网站触发重定向时可能成为安全问题。例如,如果攻击者准备了一个恶意网站,利用Facebook密码恢复机制首先登录到自己的Facebook帐户,然后重定向到连接新的社交帐户,那么你可能会发现攻击者的Facebook帐户被添加到受害者的帐户中。为了缓解这个问题,引入了SOCIALACCOUNT_LOGIN_ON_GET。
我意识到这回答了一个稍微不同的问题,因为在这种情况下用户没有确认电子邮件,但它与之相关,因为用户仍然没有直接注册/登录。
这是一个旧问题,许多人都看过,但今天我也遇到了同样的问题,所以我想分享我的解决方案。
解决这个问题的关键是遵循 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
'您需要在SOCIALACCOUNT_PROVIDERS设置中明确定义谷歌的“电子邮件”范围
'google': { 'SCOPE': ['https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email'],
'AUTH_PARAMS': { 'access_type': 'online' },
}