代码之家  ›  专栏  ›  技术社区  ›  floflo29

使用Django和python social auth重定向Facebook

  •  0
  • floflo29  · 技术社区  · 6 年前

    本地测试登录my django 通过Facebook应用程序 python-social-auth ,我遵循了以下步骤:

    • 从定义映射 127.0.0.1 www.florian.com 在里面 /etc/hosts
    • 添加 http://www.florian.com:8000/login/facebook http://www.florian.com:8000/complete/facebook 在现场 OAuth valid URI redirect 在Facebook登录中-->设置
    • python manage.py runserver www.florian.com:8000

    但是,当访问 http://www.florian.com:8000/login/facebook ,我得到以下错误:

    无法加载URL:此URL的域未包含在应用程序的域中。若要加载此URL,请将应用程序的所有域和子域添加到应用程序设置中的“应用程序域”字段。

    但是,当我使用Facebook登录中的可用字段检查此URL的有效性时-->设置,正常。

    以下是我的Django文件:

    URL。py:

    from django.conf.urls import url, include
    from django.contrib import admin
    from rest_framework import routers
    from backend import views
    from webapp import views as webapp_views
    from django.contrib.auth import views as auth_views
    
    
    router = routers.SimpleRouter()
    router.register(r'users', views.UserViewSet, 'User')
    router.register(r'games', views.GameViewSet, 'Game')
    
    urlpatterns = [
        url(r'^$', webapp_views.home, name='home'),
        url('', include('social_django.urls', namespace='social')),
    # FACEBOOK login/registration from Web 
        url(r'^login/$', auth_views.login, name='login'),
        url(r'^logout/$', auth_views.logout, name='logout'),
        url('', include('social_django.urls', namespace='social')),
        url(r'^test/', webapp_views.test),
        url(r'^admin/', admin.site.urls),
        url(r'^connect/', views.CustomObtainAuthToken.as_view()),
        url(r'^membership_create/', views.MembershipCreate.as_view()), 
    # Facebook login/registration from REST API
        url(r'^auth/connect_with_fb/', views.ConvertTokenViewWithData.as_view()),
    # standard Django login/registration from REST API
        url(r'^auth/connect_with_credentials/', views.TokenViewWithData.as_view()),
        url(r'^debug/', views.UserLoginAndIdView.as_view()),
        url(r'^auth/', include('rest_framework_social_oauth2.urls'),
    
            )
    
    ]
    
    urlpatterns += router.urls
    

    登录名。html

    {% block content %}
      <h2>Login</h2>
      <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Login</button>
      </form>
      <br>
      <p><strong>-- OR --</strong></p>
      <a href="{% url 'social:begin' 'facebook' %}">Login with Facebook</a>
    
    {% endblock %}
    

    设置。py公司

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'rest_framework.authtoken',
        'rest_framework',
        'oauth2_provider',
        'social_django',
        'rest_framework_social_oauth2',
        'backend',
        'webapp',
    ]
    
    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',
    
        'social_django.middleware.SocialAuthExceptionMiddleware',  # <--
    
    ]
    
    ROOT_URLCONF = 'WMC.urls'
    
    SOCIAL_AUTH_URL_NAMESPACE = 'social'
    
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [    os.path.join(BASE_DIR, 'templates'),
                         os.path.join(BASE_DIR, 'webapp/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',
                    'social_django.context_processors.backends',
                    'social_django.context_processors.login_redirect',
    
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = 'WMC.wsgi.application'
    
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
    
            'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
            'rest_framework_social_oauth2.authentication.SocialAuthentication',
    
        ),
    }
    
    
    AUTHENTICATION_BACKENDS = (
    
        # Facebook OAuth2
        'social_core.backends.facebook.FacebookAppOAuth2',
        'social_core.backends.facebook.FacebookOAuth2',
    
        # django-rest-framework-social-oauth2
        'rest_framework_social_oauth2.backends.DjangoOAuth2',
    
        # Django
        'django.contrib.auth.backends.ModelBackend',
    
    )
    
    # Django client_secret for OAuth Toolkit for django-rest-social-auth
    CLIENT_SECRET = '***********************************************************************************'
    
    
    # Facebook configuration
    SOCIAL_AUTH_FACEBOOK_KEY = '***********'
    SOCIAL_AUTH_FACEBOOK_SECRET = '*****************************'
    
    
    
    
    
    # Database
    # https://docs.djangoproject.com/en/1.10/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    # Define SOCIAL_AUTH_FACEBOOK_SCOPE to get extra permissions from facebook. Email is not sent by default, to get it, you must request the email permission:
    SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']
    SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
        'fields': 'id, name, email'
    }
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/1.10/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/1.10/howto/static-files/
    
    STATIC_URL = '/static/'
    
    5 回复  |  直到 6 年前
        1
  •  0
  •   HenryM    6 年前

    尝试添加

    ALLOWED_HOSTS = [`.florian.com`]
    

    settings.py

        2
  •  0
  •   Donald    6 年前

    假设您使用的是安装了Nginx的Linux开发环境。

    我不建议您使用“真实”URL进行本地测试。你应该试试 florian.local

    在您的 /etc/hosts 添加如下行:

    127.0.0.1 florian.local

    添加 弗洛里安。地方的 ALLOWED_HOSTS 在里面 settings.py 文件

    在您的 /etc/nginx/sites-available 创建文件 florian (触摸florian)内容如下:

    upstream florian {
        server 127.0.0.1:8000;
    }
    
    server {
    
        listen 80;
        server_name florian.local;
        keepalive_timeout    360;
        client_max_body_size 100M;
    
        location / {
            proxy_redirect      off;
            proxy_set_header    Host                    $host;
            proxy_set_header    X-Real-IP               $remote_addr;
            proxy_set_header    X-Forwarded-For         $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Protocol    $scheme;
            proxy_pass          http://florian;
            proxy_connect_timeout       600;
            proxy_send_timeout          600;
            proxy_read_timeout          600;
            send_timeout                600;
        }
    
    
    }
    

    CD插入 sites-enabled 并为先前创建的文件创建软链接:

    ln -s ../sites-available/florian .

    最后,不要忘记重新启动nginx,例如:

    sudo service nginx restart

    运行本地开发服务器:

    ./manage.py runserver 8000 ,则,

    然后,您可以通过 http://127.0.0.1:8000 或通过 http://florian.local

    我已经使用此方法成功地通过Facebook、Twitter和Google帐户对我的本地应用程序进行了身份验证。

        3
  •  0
  •   floflo29    6 年前

    1.6.0 的版本 social_core 库(部分 python-social-auth ),字段 REDIRECT_STATE 属于 FacebookOAuth2 后端已设置为 False

    当我使用 1.5.0 版本(其中 REDIRECT_STATE=True ),并作为 redirect_state 每次调用Facebook登录时,我的应用程序都无法处理这种动态行为。

    因此,升级 social\u核心 至版本 1.7.0 解决了问题。

        4
  •  0
  •   Neil    6 年前

    我不确定是否已经回答了这个问题,但您的站点应该使用https而不是http。

    示例:

    而不是 http://www.florian.com:8000/complete/facebook 使用此选项: https://www.florian.com:8000/complete/facebook

    Facebook不接受http站点。

    希望有帮助。

        5
  •  0
  •   gzuba    5 年前

    对于儿童:

    添加 https://yourdomain.example/oauth/complete/facebook/ 在facebook开发者网站上的“客户端OAuth设置”选项卡中选择“有效OAuth重定向URI”。

    /oauth/-这是您的django社交url的名称。