当使用django-allauth通过社交提供商进行OAuth登录时,有时它会失败并出现错误页面"社交网络登录失败"。没有包含更多信息的日志输出。此日志输出(https://github.com/pennersr/django-allauth/issues/1120)有一个功能请求,但它已打开超过一年。同时,如何获取更多信息来调试此错误?
答案 0 :(得分:6)
更多信息将传递到用于呈现错误模板的上下文,但未在默认模板中使用。
您可以通过覆盖模板并在模板中包含以下内容来获取日志输出:
{{ 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
的文件
答案 1 :(得分: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":"..."
}}'
答案 2 :(得分:2)
&#34;社交网络登录失败&#34;可能由于多种原因而发生,但网址不匹配是我遇到的最常见问题:
如果您在托管第三方时遇到此问题,请务必将预期的网址更改为托管网址
如果仅在开发过程中出现问题,您必须使用localhost或127.0.0.1在社交网站上注册。通过正确的网址打电话给社交网站。对于例如facebook不允许注册127.0.0.1但是localhost和&#34; manage.py runserver&#34;默认情况下为127.0.0.1。因此,使用&#34; localhost&#34;。
同时确保您已向网站添加了正确的网址&#39;在django admin中,它已被正确添加到&#39;社交应用程序&#39;
答案 3 :(得分:1)
当我在http上检查https网站时(如果我可以重定向生产),这也发生在我身上。错误代码/消息为空 我为http测试注释了这些:
# SESSION_COOKIE_SECURE = True
# CSRF_COOKIE_SECURE = True
# APPEND_SLASH = True
# PREPEND_WWW = True
答案 4 :(得分:0)
当我在本地测试时,我的问题有两个: 首先,我必须确保使用
启动服务器python manage.py runserver localhost:8000
然后,在管理页面中,我必须确保Sites表具有localhost:8000的条目,例如在
http://localhost:8000/en/admin/sites/site/
我遇到的问题是我在这方面有多次尝试,结果是我的localhost的ID:8000 Sites表条目变得大于1.你会注意到allauth documentation据说在settings.py中有SITE_ID = 1但如果你无意中为条目创建了一个不同的ID,你必须改变数据库条目的ID或更改SITE_ID值。
我遇到的另一个问题(与海报的问题无关)是我还有旧的注册网址模板包括干扰allauth的模板。
答案 5 :(得分:0)
如果您使用自定义SocialAccountAdapter
(可以在settings.py,read more here中设置),则可以简单地覆盖函数authentication_error
来记录所有错误。
函数签名(source here)如下:
(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"
我正在我的应用程序中执行此操作,效果很好!