2016-06-15 4 views
1

Je cherche à permettre aux utilisateurs de se connecter à mon application Web soit en créant un profil (fait par django.contrib.auth), ou en utilisant LinkedIn (fait par python-social-auth).Authentification avec Linkedin en utilisant python-social-auth

hiérarchie des fichiers pertinente est la suivante:

. 
├── ./app 
│   ├── ./app/admin.py 
│   ├── ./app/forms.py 
│   ├── ./app/__init__.py 
│   ├── ./app/models.py 
│   ├── ./app/serializers.py 
│   ├── ./app/templates 
│   │   ├── ./app/templates/app 
│   │   │   ├── ./app/templates/app/app.js 
│   │   │   ├── ./app/templates/app/create_profile.html 
│   │   │   ├── ./app/templates/app/index.html 
│   │   │   ├── ./app/templates/app/login.html 
│   │   │   ├── ./app/templates/app/profile.html 
│   │   │   ├── ./app/templates/app/signup.html 
│   │   │   └── ./app/templates/app/userhome.html 
│   ├── ./app/tests.py 
│   ├── ./app/urls.py 
│   ├── ./app/views.py 
├── ./proj 
│   ├── ./proj/settings.py 
│   ├── ./proj/urls.py 
│   ├── ./proj/wsgi.py 
└── ./manage.py 

Jusqu'à présent, je l'ai ajouté les entrées suivantes dans mon settings.py:

INSTALLED_APPS = (
    'django.contrib.auth', 
    # Entries for other purposes... 
    # ... 
    # ... 
    'social.apps.django_app.default' 
) 


AUTHENTICATION_BACKENDS = (
    'social.backends.linkedin.LinkedinOAuth', 
    'django.contrib.auth.backends.ModelBackend', 
) 

SOCIAL_AUTH_LINKEDIN_KEY = '*secret*' 
SOCIAL_AUTH_LINKEDIN_SECRET = '*secret*' 
SOCIAL_AUTH_LINKEDIN_SCOPE = [ 'r_basicprofile' ] 
LOGIN_REDIRECT_URL = '/userhome' 

TEMPLATES = [ 
{ 
    'BACKEND': 'django.template.backends.django.DjangoTemplates', 
    'DIRS': [ 
    ], 
    'APP_DIRS': True, 
    'OPTIONS': { 
     'context_processors': [ 
      # Entries for other purposes... 
      # ... 
      # ... 
      'social.apps.django_app.context_processors.backends', 
      'social.apps.django_app.context_processors.login_redirect', 
     ], 
     'debug': DEBUG, 
    }, 
},] 

En proj/urls.py, j'ai ajouté l'entrée suivante:

url('', include('social.apps.django_app.urls', namespace='social')),

Sur ma page login.html, j'ai ajouté un lien:

<br>Or, <a href="/login/linkedin">sign in with LinkedIn.</a>

Mon point de vue de la connexion à app/views.py ressemble à ceci:

def login (request): 
    form = LoginForm() 
    if request.method == 'POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = request.POST.get('username') 
      password = request.POST.get('password') 
      user = authenticate(username=username, password=password) 
      if user is not None: 
       auth_login(request, user) 
       return redirect('/userhome/') 
      else: 
       messages.error(request, 'Invalid login or password') 
     else: 
      messages.error(request, 'Missing username or password') 
    return render(request, 'app/login.html', {'form': form}) 

Actuellement, mon "Connexion avec LinkedIn" lien ne être pris en charge par le backend python-social-auth. Comme indiqué dans this tutorial, j'ai confirmé que le backend de python-social-auth fonctionne: Je peux voir des tables vides sur la page d'administration du site.

J'ai lu les tutoriels suivants ou SO entrées pour essayer de répondre à ma question:

  1. Using python-social-auth with linkedin
  2. Python Social Auth Django template example
  3. https://python-social-auth.readthedocs.io/en/latest/configuration/django.html
  4. https://github.com/omab/python-social-auth/blob/master/examples/django_example/example/settings.py

Toute idée de ce que Je suis manquant?

Répondre

1

de here

Change:

SOCIAL_AUTH_LINKEDIN_SCOPE = ['r_basicprofile'] 

à:

SOCIAL_AUTH_LINKEDIN_OAUTH2_SCOPE = ['r_basicprofile'] 

vous pouvez utiliser les éléments suivants ainsi:

SOCIAL_AUTH_LINKEDIN_OAUTH2_FIELD_SELECTORS = ['email-address', 'headline', 'industry'] 
SOCIAL_AUTH_LINKEDIN_OAUTH2_EXTRA_DATA  = [ 
    ('id', 'id'), 
    ('first-name', 'first_name'), 
    ('last-name', 'last_name'), 
    ('email-address', 'email_address'), 
    ('headline', 'headline'), 
    ('industry', 'industry') 
] 

(bien que je vais avoir des problèmes pour obtenir l'adresse e-mail)

trouvé la solution pour les courriels manquants

Ajouter ce qui suit à votre fichier settings.py:

FIELD_SELECTORS = ['email-address',] 
+1

Vous avez sauvé ma vie homme, merci!'FIELD_SELECTORS = ['email-address',]' fonctionne comme un charme! –