django-allauth:将多个社交帐户链接到单个用户

voi*_*sin 14 django django-allauth

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

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

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

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

有没有办法在现有用户之后执行此操作?

nev*_*ves 19

如果您的用户已经登录,我已使用标签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>
Run Code Online (Sandbox Code Playgroud)

设置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'}
         },
}
Run Code Online (Sandbox Code Playgroud)

我还想知道是否可以使用电子邮件地址自动关联帐户.我可以在Google和Facebook发送的socialaccount_socialaccount表的"extra_data"列中看到 "verified_email": true.对我来说,自动关联登录和强大的可用性增强就足够了.


Ted*_*Ted 13

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

要非常小心你如何做到这一点.你可能正在打开一个巨大的安全漏洞.如果您没有对用户施加任何责任,只是使用相同的电子邮件地址自动链接帐户,则会引入以下攻击媒介:

  • 在您的网站上查找用户,找出他们的电子邮件地址(通常这很容易)
  • 使用我的电子邮件在您的某个提供商处创建帐户
  • 验证电子邮件,添加他们的电子邮件,删除我的电子邮件(只有一个提供商才能完成此漏洞的完整角落案例)
  • 使用我的新的lax-provider帐户"注册"您的服务
  • 与初始用户自动匹配,即可访问其帐户

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

也许你正在做的事情风险是值得的,请注意.对用户的一点责任可能不是最糟糕的事情.

我已经看到了建议自动匹配的流量,然后询问您的密码或重新通过其中一个原始提供商进行身份验证,以将新帐户添加到您的原始帐户.这些可能没有相同的潜力可利用,但有一些脑 - f*级角落案例和UI并发症.

  • 不要在这里开始一场火焰战.您的安全问题是合理的,但安全性是一种权衡.如果我的第三方只是谷歌和Facebook而我的网站不是银行账户,也许我可以交易安全性以获得更好的可用性. (5认同)
  • 好吧,这可能是一个安全问题,但你没有回答这个问题. (3认同)
  • @neves我反对考虑这个问题.这是一个答案,而不是你想要的答案.当你的问题是"如何割断我的手臂"时,"你不应该"是99%以上的正确答案方式. (2认同)