python-social-auth: AttributeError at /complete/google-oauth2/: 'NoneType' 对象没有属性 'provider'

python-social-auth: AttributeError at /complete/google-oauth2/: 'NoneType' object has no attribute 'provider'

我正在使用我的公司帐户(即 "Google for works" 帐户)来实现 Google oauth2.0 登录到我的 django 应用程序。

"settings.py" 中的管道看起来像:

SOCIAL_AUTH_PIPELINE = [
    'social.pipeline.social_auth.social_details',
    'social.pipeline.social_auth.social_uid',
    'social.pipeline.social_auth.auth_allowed',
    'social.pipeline.social_auth.associate_by_email',
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details',
]

向管道添加条件后端。

if config.GCPAuthentication.AUTO_CREATE_ACCOUNTS:
    SOCIAL_AUTH_PIPELINE.extend([
    'social.pipeline.user.get_username',
    'social.pipeline.user.create_user'
])

尝试使用新用户首次登录时,出现错误: /complete/google-oauth2/ 处的属性错误:'NoneType' 对象没有属性 'provider'

有趣的是,用户正在创建并保存在数据库中,在下次登录尝试时它允许我登录。

此处抛出错误:https://github.com/omab/python-social-auth/blob/master/social/actions.py#L70

我的公司 Google 帐户可能没有任何社交帐户(Google+ 已禁用)/相关信息。这是个问题吗?

无论如何,你能告诉我解决这个问题的方法吗?

管道希望遵循需要调用函数的顺序。 对于我的解决方案,正确的顺序应该是:

SOCIAL_AUTH_PIPELINE = [  # Note: Sequence of functions matters here.
    'social.pipeline.social_auth.social_details',  # 0
    'social.pipeline.social_auth.social_uid',  # 1
    'social.pipeline.social_auth.auth_allowed',  # 2
    'social.pipeline.social_auth.social_user',  # 3
    'social.pipeline.user.get_username',  # 4
    'social.pipeline.social_auth.associate_by_email',  # 5
    'social.pipeline.social_auth.associate_user',  # 6
    'social.pipeline.social_auth.load_extra_data',  # 7
    'social.pipeline.user.user_details',  # 8
]

# Adding conditional functions to pipepline.
# NOTE: Sequence of functions matters here.
if config.GCPAuthentication.AUTO_CREATE_ACCOUNTS:
    SOCIAL_AUTH_PIPELINE.insert(6, 'social.pipeline.user.create_user')

是的,你是对的,管道中函数的顺序在这里很重要,因为一个函数的 return 将输入到管道中的下一个函数。

作为旁注,我想补充一点,当我通过更改主键更新 USER 模型时,我遇到了类似的问题。在这种情况下,简单地 运行ning 新 USER 模型的迁移是不够的。您还必须 运行 迁移以获得社交身份验证。我是通过完整和强制迁移整个项目来做到的。

我遇到了来自损坏的本地数据库的相同错误。我不得不清理表格:social_auth_usersocialauthdjango_session.