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

Posted

技术标签:

【中文标题】django-allauth:将多个社交帐户链接到单个用户【英文标题】:django-allauth: Linking multiple social accounts to a single user 【发布时间】:2012-10-19 20:28:35 【问题描述】:

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

谁能解释如何将社交帐户关联在一起?

我确实看到了这个帖子:how do i connect multiple social auth providers to the same django user using django-allauth? 这似乎让用户有责任首先使用一个社交帐户登录,然后为自己链接其他帐户。

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

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

【问题讨论】:

如果两个社交帐户的电子邮件地址相同,您可能会尝试自动链接。我回答了一个类似的问题,您可能会觉得它很有用 - ***.com/a/19443127/805427 【参考方案1】:

如果您的用户已经登录,我已经使用标签provider_login_url 并设置属性process="connect" 成功连接了另一个帐户。下面是代码 sn-p 放入为经过身份验证的用户显示的块中

% 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。对我来说,自动关联登录和极大的可用性增强就足够了。

【讨论】:

【参考方案2】:

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

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

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

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

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

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

【讨论】:

好的,可能是安全问题,但您没有回答问题。 @neves 我反对考虑这个问题。这是一个答案,只是不是你想要的。当问题是“我如何切断我的手臂”时,超过 99% 的情况下,“你不应该”是正确答案。 不要在这里发动火焰战争。您的安全担忧是合理的,但安全是一种权衡。如果我的第三方只是 Google 和 Facebook,而我的网站不是银行账户,也许我可以用安全性换取更好的可用性。 在到处写相同的狂欢之前请阅读问题,用户已经拥有django的帐户,您在说什么安全问题? 只有当提供者完全不受信任时,这才是一个安全问题。如果 Oauth 提供商是 Google 或 Microsoft,其中只有您的 gmail(或 micrsoft 应用程序)帐户由他们进行身份验证,那么您所说的安全漏洞被严重夸大了。易用性在许多用例中都很有意义。

以上是关于django-allauth:将多个社交帐户链接到单个用户的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django-allauth 访问用户名和配置文件

如何使用 django-allauth 访问用户名和配置文件

django-rest-auth + django-allauth + angular2

将多个Auth提供程序链接到一个帐户

如何将多个身份验证提供程序链接到 Firebase 帐户?

使用 react-google-login 和 django-allauth 刷新令牌