调试django-allauth社交网络登录失败问题

11
使用django-allauth通过社交提供商进行OAuth登录时,有时会出现错误页面“Social Network Login Failure”。没有包含更多信息的日志输出。有一个关于此日志输出的功能请求(https://github.com/pennersr/django-allauth/issues/1120),但已经开放了一年多。同时,我该如何获得更多信息来调试此错误?
7个回答

28

提供更多信息以传递到用于呈现错误模板的上下文中,但在默认模板中不使用。

您可以通过覆盖模板并包含以下内容来获取日志输出:

{{ auth_error }}

或者另一种选择:

Code: {{ auth_error.code }}, Error: {{ auth_error.exception }}

要覆盖模板,请将文件夹添加到您的Django模板DIRS中。在Django 1.8+中,这看起来像是以下内容:


TEMPLATES = [
    {
        ...
        DIRS: [os.path.join(BASE_DIR, 'templates')]
    }
]

然后,在那个文件夹中,创建一个名为socialaccount的目录,并在其中放置一个名为authentication_error.html的文件。


社交网络登录失败尝试通过你的社交网络账户进行登陆时发生了错误。`代码: 未知, 错误:{'提供商': '谷歌', '异常': 权限被拒绝(), '代码': '未知'}`有什么建议吗?@Zags - wadhwa94
这听起来像是你的 Google OAuth 消费者凭据错误或缺失。如果不是这个问题,你应该将其作为自己的问题发布。 - Zags
@wadhwa94 我在使用 Facebook 提供程序时遇到了权限被拒绝的问题,但是在将 SESSION_COOKIE_SECURE 设置为 False 后,它就可以正常工作了。 - ji-ruh
@wadhwa94 我知道这是老问题了,但你还记得你最终做了什么吗? - abdullahkady

15
如果您使用自定义的 SocialAccountAdapter(可以在您的 settings.py 中设置,在此处阅读更多信息),那么您可以简单地覆盖函数 authentication_error 以记录所有错误。
该函数签名 (源代码在这里) 如下:
(main/wherever.py):
class SocialAccountAdapter(DefaultSocialAccountAdapter):
    def authentication_error(self, request, provider_id, error, exception, extra_context):
        your_log_function(
            'SocialAccount authentication error!',
            'error',
            request,
            extra_data = {'provider_id': provider_id, 'error': error.__str__(), 'exception': exception.__str__(), 'extra_context': extra_context},
        )

(还需在settings.py中进行配置)

SOCIALACCOUNT_ADAPTER = "main.wherever.SocialAccountAdapter"

我的应用程序里面有这个功能,它非常好用!


4
毋庸置疑,这是最佳答案。 - Dominique PERETTI

4

@Zags的回答非常好,指引了我正确的方向。

基于那个回答,我建议开始通过将默认的authentication_error.html复制到你的目录树中来进行操作,例如:

$ find /wherever/your/python/is -name socialaccount
$ cp .../that/dir/socialaccount/authentication_error.html \
     ./myapp/templates/allauth/socialaccount/

然后将其添加到模板的副本中:
<p>
Code: {{ auth_error.code }}, Error: {{ auth_error.exception }}
</p>

(从技术上讲,您可以直接编辑已安装的Python版本...)

对我来说,略微格式化的结果:

Code: unknown, 
Error: Error retrieving access token: 
b'{"error":{
  "message":"This IP can\'t make requests for that application.",
  "type":"OAuthException",
  "code":5,
  "fbtrace_id":"..."
}}'

这是一个很好的澄清,我加入到了我的内容中。不幸的是,这是我得到的输出:代码:***缺失***,错误:***缺失***。你有什么想法为什么会出现这种情况? - NYCeyes
嗯,不好意思,我不知道。是不是使用了不同的Django版本? - Andrew E

2
“社交网络登录失败”可能由多种原因引起,但 URL 不匹配是我经常遇到的最常见问题:
  1. 如果您在第三方托管期间遇到此问题,请记得将预期的 URL 更改为托管网站的 URL。

  2. 如果问题仅在开发期间出现,则必须使用 localhost 或 127.0.0.1 在社交网站上注册。请通过正确的 URL 调用社交网站。例如,Facebook 不允许注册 127.0.0.1,但“manage.py runserver”会默认使用 127.0.0.1。因此,请使用“localhost”打开您的网站。

还要确保您已在 Django 管理员中添加了正确的 URL,并已正确添加到“社交应用程序”中。


问题是要求如何获取日志信息。 - Zags
抱歉,我还没有实现日志收集,但是看了一下 Github 的讨论线程,我认为这很重要。另外,我们不能使用 Django 内置的日志记录模块(https://docs.djangoproject.com/en/1.9/topics/logging/)来记录问题吗? - Sid
只有当模块确实记录信息时,Django 日志记录才会起作用。 - Zags

2
当我在http上检查https站点(如果我可以重定向到生产环境)时,这也发生在我身上。错误代码/消息为空。
我已将以下内容注释以进行http测试:
# SESSION_COOKIE_SECURE = True
# CSRF_COOKIE_SECURE = True
# APPEND_SLASH = True
# PREPEND_WWW = True

0
在我的情况下,除了标志SESSION_COOKIE_DOMAIN = mydomain.com之外,一切都很好,我只需要将其注释掉,因为我是在本地主机上工作,而不是在mydomain.com上。

0

当我在本地测试时,我的问题有两个方面:

首先,我必须确保我使用以下命令启动了服务器

python manage.py runserver localhost:8000

然后,在管理页面中,我必须确保Sites表格中有一个localhost:8000的条目,例如在

http://localhost:8000/en/admin/sites/site/

我遇到的问题是我尝试了多次,结果是我的localhost:8000站点表项的ID已经大于1。在allauth documentation中,你会注意到它说要在settings.py中设置SITE_ID = 1,但如果你意外地创建了一个不同的ID,你就必须要么改变数据库条目的ID,要么改变SITE_ID的值。
我遇到的另一个问题(与发布者的问题无关)是我也有旧的注册URL模板包含干扰了alluth的模板。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接