Ошибка "u'social" не является зарегистрированным пространством имен "в базовой интеграции Auth0 с Django 1.8 - PullRequest
0 голосов
/ 10 июня 2019

У меня есть базовая функциональная интеграция Auth0 с Django 1.9 для аутентификации пользователя, получена https://auth0.com/docs/quickstart/backend/django, которая использует Python2.7 и работает нормально.

Но я хочу изменить версию Djangoдо 1,8.Чтобы сделать это, я сделал некоторые изменения в основном в settigs, но мне чего-то не хватает.

Когда требуется доступ к http://127.0.0.1:8000/login/auth0, появляется ошибка: NoReverseMatch в / login / auth0.u'social 'не является зарегистрированным пространством имен

Этот URL-адрес соответствует social_django.urls

Код:

Settings.py

    from dotenv import load_dotenv, find_dotenv

    import os

    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

    DEBUG = True

    ALLOWED_HOSTS = []

    # Application definition

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',

        'social_django',
        'auth0login'
    )

    MIDDLEWARE_CLASSES = (
        'django.contrib.sessions.middleware.SessionMiddleware',

        'django.middleware.security.SecurityMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',

        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
    )

    ROOT_URLCONF = 'webappexample.urls'

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            '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',
                ],
            },
        },
    ]

    WSGI_APPLICATION = 'webappexample.wsgi.application'

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }

    LANGUAGE_CODE = 'en-us'
    TIME_ZONE = 'UTC'
    USE_I18N = True
    USE_L10N = True
    USE_TZ = True
    STATIC_URL = '/static/'

    # ********************************

    ENV_FILE = find_dotenv()
    if ENV_FILE:
        load_dotenv(ENV_FILE)

    # SOCIAL AUTH AUTH0 BACKEND CONFIG
    SOCIAL_AUTH_TRAILING_SLASH = False
    SESSION_COOKIE_SECURE = False
    CSRF_COOKIE_SECURE = False
    SECURE_SSL_REDIRECT = False

    SOCIAL_AUTH_AUTH0_KEY = os.environ.get('AUTH0_CLIENT_ID')
    SOCIAL_AUTH_AUTH0_SECRET = os.environ.get('AUTH0_CLIENT_SECRET')
    SOCIAL_AUTH_AUTH0_SCOPE = [
        'openid',
        'profile'
    ]
    SOCIAL_AUTH_AUTH0_DOMAIN = os.environ.get('AUTH0_DOMAIN')
    AUDIENCE = None
    if os.environ.get('AUTH0_AUDIENCE'):
        AUDIENCE = os.environ.get('AUTH0_AUDIENCE')
    else:
        if SOCIAL_AUTH_AUTH0_DOMAIN:
            AUDIENCE = 'https://' + SOCIAL_AUTH_AUTH0_DOMAIN + '/userinfo'
    if AUDIENCE:
        SOCIAL_AUTH_AUTH0_AUTH_EXTRA_ARGUMENTS = {'audience': AUDIENCE}
    AUTHENTICATION_BACKENDS = {
        'auth0login.auth0backend.Auth0',
        'django.contrib.auth.backends.ModelBackend'
    }

    LOGIN_URL = '/login/auth0'
    LOGIN_REDIRECT_URL = '/dashboard'
    SOCIAL_AUTH_URL_NAMESPACE = 'social'

urls.py

    from django.conf.urls import url, include
    from . import views

    urlpatterns = [
        url(r'^$', views.index),
        url(r'^dashboard$', views.dashboard),
        url(r'^logout$', 'django.contrib.auth.views.logout', {'next_page': '/'}),
        url(r'^', include('django.contrib.auth.urls')),
        url(r'^', include('social_django.urls')),
    ]

views.py

    from django.shortcuts import render
    from django.contrib.auth.decorators import login_required
    from django.contrib.auth import logout as log_out
    from django.conf import settings
    from django.http import HttpResponseRedirect, HttpResponse

    import json

    from django.utils.http import urlencode


    def index(request):
        username = None
        if request.user.is_authenticated():
            username = request.user.username

        viewItems = {
            'username':username
        }

        return render(request, 'index.html', viewItems)


    @login_required
    def dashboard(request):
        user = request.user
        auth0user = user.social_auth.get(provider='auth0')
        userdata = {
            'user_id': auth0user.uid,
            'name': user.first_name,
            'picture': auth0user.extra_data['picture']
        }

        return render(request, 'dashboard.html', {
            'auth0User': auth0user,
            'userdata': json.dumps(userdata, indent=4)
        })

index.html

    {% extends 'layout.html' %}

    {% block content %}
        <div class="login-page clearfix">
            <div class="login-box auth0-box before">
                <img src="https://i.cloudup.com/StzWWrY34s.png" />
                <h3>Auth0 Example</h3>
                {%  if username == None %}
                  <p> No se encuentra logeado ningún usuario.</p>
                  <a class="btn btn-primary" href="/login/auth0">Login</a><br>
                {% else %}
                  <p> Se encuentra logeado el usuario: {{ username }}.</p>
                  <a class="btn btn-primary" href="/logout">Logout</a><br>
                {% endif %}
            </div>
        </div>
    {% endblock content %}

auth0backend.py

    from urllib2 import urlopen
    from jose import jwt
    from social_core.backends.oauth import BaseOAuth2


    class Auth0(BaseOAuth2):
        """Auth0 OAuth authentication backend"""
        name = 'auth0'
        SCOPE_SEPARATOR = ' '
        ACCESS_TOKEN_METHOD = 'POST'
        EXTRA_DATA = [
            ('picture', 'picture')
        ]

        def authorization_url(self):
            print 'https://' + self.setting('DOMAIN') + '/authorize'
            return 'https://' + self.setting('DOMAIN') + '/authorize'

        def access_token_url(self):
            print 'https://' + self.setting('DOMAIN') + '/oauth/token'
            return 'https://' + self.setting('DOMAIN') + '/oauth/token'

        def get_user_id(self, details, response):
            """Return current user id."""
            print details['user_id']
            return details['user_id']

        def get_user_details(self, response):
            # Obtain JWT and the keys to validate the signature
            id_token = response.get('id_token')
            jwks = urlopen('https://' + self.setting('DOMAIN') + '/.well-known/jwks.json')
            issuer = 'https://' + self.setting('DOMAIN') + '/'
            audience = self.setting('KEY')  # CLIENT_ID
            payload = jwt.decode(id_token, jwks.read(), algorithms=['RS256'], audience=audience, issuer=issuer)

            print {'username': payload['nickname'],
                    'first_name': payload['name'],
                    'picture': payload['picture'],
                    'user_id': payload['sub']}
            return {'username': payload['nickname'],
                    'first_name': payload['name'],
                    'picture': payload['picture'],
                    'user_id': payload['sub']}

1 Ответ

0 голосов
/ 11 июня 2019

Глядя на ваш urls.py Я не вижу маршрут, который вы ищете, чтобы использовать. Вы пролистали свое приложение, а также панель инструментов приложения Auth0, чтобы убедиться, что все внесенные изменения также отражены там? Это будет первый шаг, который я бы порекомендовал решить эту проблему. Я надеюсь, что это поможет вам в ваших поисках!

...