使用django-allauth通过社交提供商进行OAuth登录时,有时会出现错误页面“Social Network Login Failure”。没有包含更多信息的日志输出。有一个关于此日志输出的功能请求(https://github.com/pennersr/django-allauth/issues/1120),但已经开放了一年多。同时,我该如何获得更多信息来调试此错误?
提供更多信息以传递到用于呈现错误模板的上下文中,但在默认模板中不使用。
您可以通过覆盖模板并包含以下内容来获取日志输出:
{{ 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
的文件。
SocialAccountAdapter
(可以在您的 settings.py 中设置,在此处阅读更多信息),那么您可以简单地覆盖函数 authentication_error
以记录所有错误。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"
我的应用程序里面有这个功能,它非常好用!
@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如果您在第三方托管期间遇到此问题,请记得将预期的 URL 更改为托管网站的 URL。
如果问题仅在开发期间出现,则必须使用 localhost 或 127.0.0.1 在社交网站上注册。请通过正确的 URL 调用社交网站。例如,Facebook 不允许注册 127.0.0.1,但“manage.py runserver”会默认使用 127.0.0.1。因此,请使用“localhost”打开您的网站。
还要确保您已在 Django 管理员中添加了正确的 URL,并已正确添加到“社交应用程序”中。
# SESSION_COOKIE_SECURE = True
# CSRF_COOKIE_SECURE = True
# APPEND_SLASH = True
# PREPEND_WWW = True
SESSION_COOKIE_DOMAIN = mydomain.com
之外,一切都很好,我只需要将其注释掉,因为我是在本地主机上工作,而不是在mydomain.com上。当我在本地测试时,我的问题有两个方面:
首先,我必须确保我使用以下命令启动了服务器
python manage.py runserver localhost:8000
然后,在管理页面中,我必须确保Sites表格中有一个localhost:8000的条目,例如在
http://localhost:8000/en/admin/sites/site/