django social-auth多账户关联

时间:2013-04-14 18:13:34

标签: python django single-sign-on django-socialauth

我正在使用django social-auth(http://django-social-auth.readthedocs.org/en/latest/index.html)并尝试创建用户配置文件,用户可以在其中关联多个帐户(如此处在Stackoverflow上)。

目前我正处于单个用户可以使用不同身份验证提供程序登录的位置,但是对于每个登录,都会创建一个新用户。如何将所有用户帐户关联到一个用户帐户(如用户个人资料)?

此外,使用django social-auth时创建用户个人资料页面的最佳做法是什么?

2 个答案:

答案 0 :(得分:11)

DSA已经支持多个帐户关联,其诀窍是用户必须登录,否则DSA不知道它应该与现有帐户相关联。

关于您的个人资料,向DSA添加功能的推荐方法是扩展pipeline,您可以创建如下条目:

def create_profile(user, is_new=False, *args, **kwargs):
    if is_new:
        # create a profile instance for the given user
        create_user_profile(user)

然后在以下设置中注册:

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user',
    'social_auth.backends.pipeline.user.get_username',
    'social_auth.backends.pipeline.user.create_user',
    'social_auth.backends.pipeline.social.associate_user',
    'social_auth.backends.pipeline.social.load_extra_data',
    'social_auth.backends.pipeline.user.update_user_details',
    'myapp.pipeline.create_profile'
)

条目是获取该功能的导入路径。

编辑:链接到文档和设置说明。

答案 1 :(得分:1)

当您想要处理多个帐户关联时,我会看到2个替代:

    1. 查找所有身份提供商所拥有的唯一属性。
    1. 保留基本身份验证并将所有其他身份提供程序链接到其。

第一种方法有两个缺点

  • 可能不存在所有身份提供者中存在的任何属性。 人们过去做过的一个常见的实现是使用电子邮件作为此属性来识别用户,但是例如Twitter不再共享电子邮件。

  • 可以找到不一致的问题。例如,人们可以为不同的提供者设置用户名或电子邮件的不同值。

我建议你实施第二种方法。设置主身份提供程序(ldap,数据库或身份验证已关闭且对您安全)。每当用户想要将“X身份提供者”链接到您的帐户时,请查找此提供者使用的属性,并将您的主要身份与该新身份之间的关系保存在表格中。

还要注意数据整理。在设置本地帐户的数据时设置提供商将具有首选项,以便不会将数据设置错误或过期。 (阅读关于“Level of assurance

的一些事情

这是一个古老的辩论,所以首先实现一些东西,开始阅读。有很多关于这个issues

的有趣文档

与django中的具体问题有关。阅读不同djago social-auth apps之间的这种比较。另请检查django-socialprofile和此old thread