Django 2.0 - 使用allauth登录Facebook - 无法加载URL:此URL的域未包含在应用程序的域中

时间:2018-04-10 16:10:51

标签: python django facebook-login django-allauth

我正在做一个需要用facebook登录的小项目。我在https://localhost:8000/

在当地工作

使用的技术是Django 2.0,django-allauth,为了避免因没有使用SSL连接而出现的错误,我使用Django-sslserver作为开发服务器。

当我点击我网站上的facebook-login按钮时,我被重定向到这个地址: https://www.facebook.com/v2.12/dialog/oauth?client_id=160259374640207&redirect_uri=https%3A%2F%2Flocalhost%3A8000%2Fsocial-auth%2Ffacebook%2Flogin%2Fcallback%2F&scope=email+user_friends+public_profile&response_type=code&state=pavN29C9zMgo&auth_type=reauthenticate

我有这个错误:

  

无法加载网址:此网址的域名未包含在应用中   域。要加载此网址,请添加所有域和子域   应用程序设置中的应用程序域字段。

settings.py 文件的一部分:

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['mysite.com', 'localhost']


# Application definition
INSTALLED_APPS = [
    # My Apps
    'account',

    # Django Apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',

    # Third party Apps
    'sslserver',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.facebook',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'django_social_website.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # allauth specific context processors
                # "allauth.account.context_processors.account",
                # "allauth.socialaccount.context_processors.socialaccount",
            ],
        },
    }
]

WSGI_APPLICATION = 'django_social_website.wsgi.application'

SITE_ID = 1


SOCIALACCOUNT_PROVIDERS = {
    'facebook': {
        'METHOD': 'oauth2',
        'SCOPE': ['email', 'public_profile', 'user_friends'],
        'AUTH_PARAMS': {'auth_type': 'reauthenticate'},
        'INIT_PARAMS': {'cookie': True},
        'FIELDS': [
            'id',
            'email',
            'name',
            'first_name',
            'last_name',
            'verified',
            'locale',
            'timezone',
            'link',
            'gender',
            'updated_time',
        ],
        'EXCHANGE_TOKEN': True,
        'LOCALE_FUNC': 'path.to.callable',
        'VERIFIED_EMAIL': False,
        'VERSION': 'v2.12',
    }
}

# facebook
SOCIAL_AUTH_FACEBOOK_KEY = '****************'  # App ID
SOCIAL_AUTH_FACEBOOK_SECRET = '***********************************'  # app key


# little options for your page's signup.

ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = True

login.html 模板文件的一部分:

{% extends "base.html" %}
{% load socialaccount %}
{% providers_media_js %}

<div class="social">
        <ul>
            <li class="facebook"><a href="{% provider_login_url "facebook" method="oauth2" %}">Login with Facebook</a></li>
        </ul>
    </div>

主要项目 urls.py 文件:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('account/', include('account.urls', namespace='account')),
    path('social-auth/', include('allauth.urls'), name='social-begin'),
]

在这里,您可以在“developers.facebook.com”网站上找到有关设置的几个屏幕截图,了解它目前是如何配置的。我一直在尝试很多不同的选择,但其中任何一个都在运作。 enter image description here enter image description here

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

最后,我得到了它的工作,感谢@HenryM和irc的非常友好的同事://irc.freenode.net/django。

在本网站上,您可以看到Facebook有不同的要求,如果您的网站是在2018年3月之前或之后创建的: https://wp-native-articles.com/blog/news/how-to-fix-facebook-apps-error-cant-load-url-domain-url-isnt-included-apps-domains/

使我的应用程序正常工作的正确设置就是这样的答案:
Django 2.0 allauth Facebook 2018

1)您需要ssl连接:

我使用了django-sslserver

2)设置与localhost不同的域名,例如“ development.com

如果您希望本地工作域为'development.com',请使用Windows添加'127.0.0.1 development.com'。

3)在'developers.facebook.com'上设置:

基本设置
- 应用领域:“AnySite.com”
- 隐私政策网址:“https://AnySite.com/myprivacy/
- 网站:“https://AnySite.com/
高级设置
- 服务器IP白名单:将其留空 - 域管理器:将其留空

Facebook登录设置
- 是客户端OAuth登录
- 是的网络OAuth登录
-Yes(new:forced)对redicect URL使用严格模式
- 是嵌入式浏览器OAuth登录
- 是的,强制使用HTTPS -Valid OAuth重定向网址:
https://AnySite.com/accounts/facebook/login/callback/”(强制性)

我希望它有所帮助!

答案 1 :(得分:0)

Facebook需要它认为真实的网址,所以你需要给它一个,例如www.development.com,然后在你的主机文件中(我不知道文件在Mac上是什么或者PC,但它是Linux上的主机)直接在localhost下面或之后添加行

www.development.com 127.0.0.1

这就是我做的事情,而且有效。

答案 2 :(得分:0)

我也坚持同样的问题,感谢@ralfillo,它清除了大部分内容。以下是我完成此过程所遵循的步骤。

  1. 安装django-sslserver并在已安装的应用列表中添加sslserver。
  2. 现在,如果您使用的是Ubuntu,请编辑此文件/etc/hosts并添加此127.0.0.2 development.com。显然你可以使用任何其他地址,但域名必须是那个。
  3. 现在返回关于您的应用设置的Facebook开发者页面,然后您需要将应用域添加到https://development.com:8000/,并在底部网站部分添加网站网址为https://development.com:8000/。 注意:在客户端OAuth设置中,只有“Force Web OAuth Reauthentication”将设置为no否则所有内容都将为Yes。
  4. 保存这些更改并转到Facebook登录设置页面,然后将有效的OAuth重定向URI添加为https://development.com:8000/accounts/facebook/login/callback/
  5. 保存这些更改,然后保存在终端类型python manage.py runsslserver 127.0.0.2:8000
  6. 转到您的浏览器并输入网址https://development.com:8000/,然后您应该可以看到您的服务器正在运行。现在做你的facebook身份验证,它会正常工作。