【问题标题】:Social-auth AuthCanceled error after redirect from facebook从 facebook 重定向后的 Social-auth AuthCanceled 错误
【发布时间】:2019-08-26 17:01:34
【问题描述】:

我已经在生产环境中设置了 social-auth-app-django。但是在 facebook 重定向之后,我得到了 AuthCanceled 并且仍然无法让它工作。

在我用于注册的用户模型电子邮件地址中。这是我的用户模型:

class User(AbstractUser):
    email = models.EmailField(_('email address'), unique=True)
    avatar = models.ImageField(blank=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

在 settings.py 中:

MIDDLEWARE = [
    ...
    'social_django.middleware.SocialAuthExceptionMiddleware',
]

TEMPLATES = [
    ...
        'context_processors': [
            ...
            'social_django.context_processors.backends',
            'social_django.context_processors.login_redirect',
    ],
]

AUTHENTICATION_BACKENDS = (
    'social_core.backends.facebook.FacebookOAuth2',
    'accounts.backends.ModelBackend'
)

LOGIN_URL = '/'
LOGOUT_URL = '/'
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

SOCIAL_AUTH_FACEBOOK_KEY = '..'  # App ID
SOCIAL_AUTH_FACEBOOK_SECRET = '...'  # App Secret
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
    'fields': 'id,name,email',
}

SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'social_core.pipeline.social_auth.auth_allowed',
    'social_core.pipeline.social_auth.social_user',
    'social_core.pipeline.user.get_username',
    'social_core.pipeline.user.create_user',
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
)

Facebook 登录应用中的有效 OAuth 重定向 URI:https://example.com/oauth/complete/facebook/

感谢您的时间和帮助。

【问题讨论】:

    标签: django facebook python-social-auth


    【解决方案1】:

    对我来说,一切都像魅力一样运作:Facebook、Google、Twitter 和 github。 这可能是配置问题。

    这是我设置所有内容的方式(注意:我在 Facebook 中处于 开发者 模式,但它适用于我的 2 个帐户),我希望这可以帮助:

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'social_django',
        'compressor',
        'app',
    )
    
    MIDDLEWARE = (
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.locale.LocaleMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'django.middleware.security.SecurityMiddleware',
        'social_django.middleware.SocialAuthExceptionMiddleware',
    )
    
    AUTHENTICATION_BACKENDS = (
        'social_core.backends.google.GoogleOAuth2',
        'social_core.backends.facebook.FacebookOAuth2',
        'social_core.backends.twitter.TwitterOAuth',
        'social_core.backends.github.GithubOAuth2',
    
        'django.contrib.auth.backends.ModelBackend',
    )
    
    # https://simpleisbetterthancomplex.com/
    # tutorial/2016/10/24/how-to-add-social-login-to-django.html
    SOCIAL_AUTH_GITHUB_KEY = 'xxx'
    SOCIAL_AUTH_GITHUB_SECRET = 'xxx'
    
    SOCIAL_AUTH_TWITTER_KEY = 'xxx'
    SOCIAL_AUTH_TWITTER_SECRET = 'xx'
    
    SOCIAL_AUTH_FACEBOOK_KEY = 'xxxx'
    SOCIAL_AUTH_FACEBOOK_SECRET = 'xxx'
    SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']
    SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
      'fields': 'name, email, age_range'
    }
    
    SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'xxx'
    SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'xxx'
    

    【讨论】:

    • 难以置信。仍然不起作用..是时候尝试另一个库了。谢谢你的回答!
    • 如果我是你,我会尝试以下(长)解决方案:尝试创建一个新项目并逐步包含 social-auth。我相信它会起作用的。然后复制/粘贴上一个项目中的所有文件以包含它们并验证它是否仍然有效。我相信找到另一个图书馆需要更长的时间。 social-auth 是一个非常好的库,我遇到了很多问题(包括失去我的一个客户!!),因为其他糟糕的社交、维护不善的 auth Python 库(我不想说是哪一个)。
    • 非常感谢。最后,它起作用了。为 nginx 添加 X-Forwarded-Forhost 标头后,并在设置中设置 SOCIAL_AUTH_RAISE_EXCEPTIONS = False
    【解决方案2】:

    对于那些登陆这个问题的人,在通过电子邮件与 OP 讨论该主题后,问题是由于在将code 交换为access_token 时,redirect_uri 的构建不正确造成的。

    这个 URI 的错误构建是因为 Django 后端位于 Nginx 后面,但没有将正确的标头传递给它(X-Forwarded-ForHost),所以 Django 不知道它是服务请求的正确主机因为,最后,URL 指向 localhost 而不是预期的域。

    【讨论】:

    • 并设置SOCIAL_AUTH_RAISE_EXCEPTIONS = False(至少在我的情况下)。非常感谢马蒂亚斯!非常感谢!
    【解决方案3】:

    我也不知道有什么区别

    https://example.com/oauth/complete/facebook/
    

    https://example.com/social-auth/complete/facebook/
    

    在我的情况下,我将两者都包括在内并且有效

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      相关资源
      最近更新 更多