Error "u'social' is not a registered namespace" in basic integration of Auth0 with Django 1.8

90 views Asked by At

I have a basic functional integration of Auth0 with Django 1.9 for user authentication, obtained of https://auth0.com/docs/quickstart/backend/django that use Python2.7 and works fine.

But I whant change the version of the Django to 1.8. To do this I did some changes mostly in settigs, but I'm missing something.

When whant to access to http://127.0.0.1:8000/login/auth0 get the error: NoReverseMatch at /login/auth0. u'social' is not a registered namespace

That URL match with social_django.urls

The code is:

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

There are 1 answers

0
Coding Morrison On

Looking at your urls.py I don't see the route you are looking to leverage. Have you combed through your app as well as well as your Auth0 application dashboard to confirm that any changes made are reflected there as well? That would be the first step I would recommend to resolve this issue. I hope this helps you in your quest!