调试AllAuth:尽管成功连接,社交帐户仍未记录用户

问题描述 投票:5回答:1

在登录表单中单击facebook登录按钮会正确显示fb登录弹出窗口,但在输入凭据后弹出窗口关闭且没有任何反应。

再次单击该按钮而不重新加载页面确认fb帐户已连接为浏览器控制台打印:

用户已连接时调用FB.login()。

但是,在用户数据库中没有新条目,用户没有被重定向,也没有登录。所以问题似乎在于AllAuth如何处理事情。虽然后端的任何地方都没有显示调试信息,但这有点难以理解。

这是allauth设置:

LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'
DEFAULT_FROM_EMAIL = "[removed for stackoverflow]"

ACCOUNT_EMAIL_REQUIRED = True
SOCIALACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
SOCIALACCOUNT_EMAIL_VERIFICATION = "mandatory"

SOCIALACCOUNT_QUERY_EMAIL = True
SOCIALACCOUNT_PROVIDERS = \
    {'facebook':
       {'METHOD': 'oauth2',
        'SCOPE': ['email','public_profile', 'user_friends'],
        'AUTH_PARAMS': {'auth_type': 'reauthenticate'},
        'FIELDS': [
            'id',
            'email',
            'name',
            'first_name',
            'last_name',
            'verified',
            'locale',
            'timezone',
            'link',
            'updated_time'],
        'EXCHANGE_TOKEN': True,
        'VERIFIED_EMAIL': False,
        'VERSION': 'v2.4'}}

这是登录页面上的js:

<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId      : '[removed for stackoverflow]',
      xfbml      : true,
      version    : 'v2.10'
    });
    FB.AppEvents.logPageView();
  };

  (function(d, s, id){
     var js, fjs = d.getElementsByTagName(s)[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement(s); js.id = id;
     js.src = "//connect.facebook.net/en_US/sdk.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
</script>
javascript django facebook django-allauth
1个回答
5
投票

Django-allauth Facebook Login

首先,安装django-allauth

$(venv) pip3 install django-allauth

现在将这些代码放在settings.py中已安装的应用程序中

'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.facebook',

另外,将下面的代码放到settings.py中

AUTHENTICATION_BACKENDS = (
    'allauth.account.auth_backends.AuthenticationBackend',
    'django.contrib.auth.backends.ModelBackend',
)

还将这些放在settings.py中

SOCIALACCOUNT_PROVIDERS = \
    {'facebook':
       {'METHOD': 'oauth2',
        'SCOPE': ['email','public_profile', 'user_friends'],
        'AUTH_PARAMS': {'auth_type': 'reauthenticate'},
        'FIELDS': [
            'id',
            'email',
            'name',
            'first_name',
            'last_name',
            'verified',
            'locale',
            'timezone',
            'link',
            'gender',
            'updated_time'],
        'EXCHANGE_TOKEN': True,
        'LOCALE_FUNC': lambda request: 'kr_KR',
        'VERIFIED_EMAIL': False,
        'VERSION': 'v2.4'}}

ID和密钥可以在https://developers.facebook.com/创建一个应用程序并转到DashBoard,你会看到你的

#facebook
SOCIAL_AUTH_FACEBOOK_KEY = 'secret!'  # App ID
SOCIAL_AUTH_FACEBOOK_SECRET ='secret!' #app key

您可能想要添加此内容

LOGIN_REDIRECT_URL = "/" 
#if you succeed in login, you'll be redirected to the main page.

现在我们需要修改urls.py将此代码添加到urlpatterens

url(r'^accounts/',include('allauth.urls')),

现在回到https://developers.facebook.com/进入设置,点击“添加平台”,点击网站,输入http://localhost:8000/并点击快速启动按钮。继续前进,做dev.facebook导致的。

现在,您需要在settings.py中设置您的网站ID

#site id
SITE_ID = <your local host site id> #i.e http://localhost:8000
# for the dev mode, you need to use localhost's id facebook does not support the name 127.0.0.1:8000
#little options for your page's signup.
ACCOUNT_EMAIL_REQUIRED=True

我们需要在我们的django admin中注册我们的站点ID和社交应用程序。首先执行迁移和运行服务器

$(venv) python3 manage.py migrate

转到http://localhost:8000/admin/并单击站点ID更改example.com到http://localhost:8000(如果您已经处于生产级别,则可能只使用您页面的IP或域。)

enter image description here

保存应用程序后,我们准备用facebook登录。将这些模板标记放在您要让用户登录的html的顶部。

{% load socialaccount %}
{% providers_media_js %}

你可以在你想要登录按钮的位置写下这个确切的位置

<a href="{% provider_login_url "facebook" method="js_sdk" %}">Login Button image</a>

这会将您的请求发送到处理您的登录程序的帐户/登录页面。

参考:https://medium.com/@jinkwon711/django-allauth-facebook-login-b536444cbc6b

© www.soinside.com 2019 - 2024. All rights reserved.