20

在测试 django-allauth 时,如果我使用不同的社交帐户登录和注销,它们似乎没有链接在一起(因为我无法通过查看 socialaccount_set.all.0、socialaccount_set.all.1 等来访问它们)。

有人可以解释如何将社交帐户链接在一起吗?

我确实看到了这篇文章:如何使用 django-allauth 将多个社交身份验证提供者连接到同一个 django 用户?这似乎让用户有责任首先使用一个社交帐户登录,然后为自己链接其他帐户。

当然,应该有一种方法可以做到这一点,而不会让用户承担责任?也许通过电子邮件地址?

有没有办法在现有用户的情况下做到这一点?

4

2 回答 2

24

如果您的用户已经登录,我已经使用标签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. 对我来说,自动关联登录和极大的可用性增强就足够了。

于 2013-10-14T04:41:29.857 回答
16

当然,应该有一种方法可以做到这一点,而不会让用户承担责任?也许通过电子邮件地址?

要非常小心你如何做到这一点。您可能会打开一个巨大的安全漏洞。如果您不对用户承担一些责任,而只是自动链接具有相同电子邮件地址的帐户,则会引入以下攻击向量:

  • 在您的网站上查找用户,找出他们的电子邮件地址(通常这很容易)
  • 使用我的电子邮件在您的提供商之一创建帐户
  • 验证电子邮件,添加他们的电子邮件,删除我的电子邮件(只需要你的一个提供商不做完整的角落案例来打开这个洞)
  • 使用我的新宽松提供者帐户“注册”您的服务
  • 自动分配给初始用户,访问他们的帐户

您可以采取措施降低这种风险,但即使所有提供商现在都需要电子邮件确认,第 3 方团队中的任何失误都会在您的安全性中打开这个漏洞。

也许你正在做的风险是值得的,只是请小心。对用户有点责任可能不是最糟糕的事情。

我已经看到它建议自动匹配的流程,然后要求您输入密码或与原始提供商之一重新进行身份验证以将新帐户添加到您的原始帐户。这些不会有同样的利用潜力,但有一些脑力激荡级别的极端情况和 UI 并发症。

于 2012-12-15T21:06:02.577 回答