Django-allauth: 将多个社交账号链接到单个用户

21

在测试django-allauth时,如果我使用不同的社交账号登录并注销,它们似乎没有链接在一起(也就是说,我不能通过查看socialaccount_set.all.0、socialaccount_set.all.1等来访问它们)。

有人能解释一下如何将社交账号链接在一起吗?

我确实看到了这篇文章:如何使用django-allauth将多个社交认证提供者连接到同一个Django用户?,它似乎把责任放在用户身上,要求用户先用一个社交账号登录,然后自己链接其他账号。

肯定有一种方法可以在不把责任推给用户的情况下完成这个操作吧?也许通过电子邮件地址?

是否可以在现有用户之后完成这个操作呢?


如果社交帐户的电子邮件地址相同,您可以尝试自动链接。我曾回答过类似的问题,您可能会发现它有用- https://dev59.com/t2Ik5IYBdhLWcg3wWs9z#19443127 - elssar
2个回答

25
如果用户已经登录,我已经成功地使用标签provider_login_url并设置属性process =“connect”来连接另一个帐户。 下面是要在“已验证用户”块中显示的代码片段:
{% load socialaccount %}
<p><a href="{% provider_login_url "facebook" process="connect" %}">Connect a facebook account</a></p>
<p><a href="{% provider_login_url "google" process="connect" %}">Connect a Google account</a></p>

设置 SOCIALACCOUNT_QUERY_EMAIL=True,并确保在您的提供商范围内请求电子邮件:

SOCIALACCOUNT_PROVIDERS = \
    {'facebook':
         {'SCOPE': ['email', ],
          'AUTH_PARAMS': {'auth_type': 'reauthenticate'},
          'METHOD': 'oauth2',
          'LOCALE_FUNC': lambda request: 'pt_BR'},
     'google':
         {'SCOPE': ['https://www.googleapis.com/auth/userinfo.profile',
                    'email'],
          'AUTH_PARAMS': {'access_type': 'online'}
         },
}

我还想知道是否可能使用电子邮件地址自动关联一个帐户。我可以在socialaccount_socialaccount表的“extra_data”列中看到,Google和Facebook都发送了 "verified_email": true。对于我来说,自动关联登录信息将会是足够的,并且可以大大提高可用性。


16
当然可以有一种方法来避免让用户承担责任,比如使用电子邮件地址?但是要非常小心这样做。如果你没有让用户承担责任就自动链接具有相同电子邮件地址的账户,那么会引入以下攻击向量: - 找到您网站上的用户,找出他们的电子邮件地址(通常很容易) - 在其中一个您的提供商处使用我的电子邮件创建账户 - 验证电子邮件,添加他们的电子邮件,删除我的电子邮件(只需要一个您的提供商不执行完整的角落案例即可打开此漏洞) - 使用我的新松弛提供商帐户"注册"您的服务 - 获得与初始用户自动匹配的权限,访问他们的账户
您可以采取措施降低此风险,但即使现在所有提供商都需要电子邮件确认,第三方团队中的任何疏忽也会在您的安全性中打开此漏洞。也许对于您正在做的事情而言,这种风险是值得的,但请小心。对用户施加一些责任可能并不是最糟糕的事情。 我见过一些流程,它建议进行自动匹配,然后要求您输入密码或重新使用原始提供商进行身份验证,以将新账户添加到您的原始账户中。这些流程不会有相同的潜在利用风险,但有一些脑部-xx级别的角落案例和UI复杂性。

4
好的,这可能是一个安全问题,但是您没有回答这个问题。 - neves
7
我反对考虑这个问题。它是一个回答,只是不是你想要的那种回答。当问题是“我该如何砍掉我的手臂”时,“你不应该这样做”才是正确的答案,而且在大多数情况下都是正确的答案,百分之九十九以上。 - Ted
11
不想在这里引发争论。您的安全顾虑是合理的,但安全是一种权衡。如果我的第三方只有谷歌和Facebook,而我的网站不是银行账户,也许我可以为了更好的可用性而牺牲一些安全性。 - neves
请在随处赞扬之前阅读问题,用户已经拥有Django的帐户,您所谈论的安全问题是什么? - Denis
只有在提供者完全不受信任的情况下,这才是一个安全问题。如果Oauth提供者是Google或Microsoft,他们只验证您的Gmail(或Microsoft应用程序)帐户,那么您所说的安全漏洞就被严重夸大了。在许多使用情况下,易用性是有意义的。 - Rohit

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