2016-07-04 45 views
0

我一直試圖讓Facebook登錄爲我的Django應用程序工作。我有一個自定義用戶,除了Facebook認證之外,Facebook只會傳回用戶的用戶名,而我想要用戶名,電子郵件地址,名字,姓氏和個人資料圖片。我遇到的另一個問題是,成功驗證後,我的應用程序會簡單地返回到原始網址'#_=_'Django社交身份驗證訪問名和姓氏

我最大的問題是我不知道如何從Facebook身份驗證中獲得我需要的正確結果,而且文檔似乎沒有涵蓋它。

Settings.py

AUTHENTICATION_BACKENDS = (
     'django.contrib.auth.backends.ModelBackend', 
     'trending.backend.ActiviistUserBackend', 
     'social_auth.backends.facebook.FacebookBackend', 
) 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'trending', 
    'gunicorn', 
    'cloudinary', 
    'social_auth', 
) 

SOCIAL_AUTH_FACEBOOK_SCOPE = ['email'] 
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = { 
    'fields': 'id,name,email', 
} 

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user', 
    'social_auth.backends.pipeline.associate.associate_by_email', 
    'social_auth.backends.pipeline.user.get_username', 
    'social_auth.backends.pipeline.social.associate_user', 
    'social_auth.backends.pipeline.social.load_extra_data', 
    'social_auth.backends.pipeline.user.update_user_details', 
    'social_auth.backends.pipeline.user.create_user' 
) 

LOGIN_URL = '/log_in/' 
LOGIN_REDIRECT_URL = '/' 
LOGIN_ERROR_URL = '/log_in/' 
SOCIAL_AUTH_USER_MODEL = 'trending.ActiviistUser' 


MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.middleware.security.SecurityMiddleware', 
) 

Log_in.html

<div id = 'wrapper'><div id = 'shiftlog'> 

<h1>Log In</h1> 
<br> 
<form action="/log_in/" method="post"> 
    {% csrf_token %} 
    {{ form.as_p}} 
    <input type="submit" value="Log In" /> 
</form><br><br> 

<a href='/sign_up/' id = 'signup'>Need an Account?</a> 
<a href="{%url 'socialauth_begin' 'facebook' %}">Login with Facebook</a> 

</div></div> 

models.py

from django.db import models 
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager 
# Create your models here. 

class ActUserManager(BaseUserManager): 
    use_in_migrations = True 

    def create_user(self, email, **extra_fields): 
     """ 
     Creates and saves a User with the given username, email and password. 
     """ 
     print email 
     email = self.normalize_email(email) 
     user = self.model(username=email, **extra_fields) 
     user.save(using=self._db) 
     return user 

class ActiviistUser (AbstractBaseUser): 
    firstname = models.CharField(verbose_name="First Name", max_length=30, default="") 
    lastname = models.CharField(verbose_name="Last Name", max_length=30, default="") 
    username = models.CharField(verbose_name="User Name", max_length=30, default="") 
    is_active = models.BooleanField(default=False) 
    email = models.EmailField(
     verbose_name='Email Address', 
     max_length=255, 
     unique=True, 
     default='' 
    ) 

    USERNAME_FIELD = 'email' 
    objects = ActUserManager() 

回答

0

定義此設置:

SOCIAL_AUTH_FACEBOOK_EXTRA_DATA = ['first_name', 'last_name'] 
Then you can access those values with: 

social = user.social_auth.get(provider='facebook') 
userid = social.uid 
first_name = social.extra_data['first_name'] 
last_name = social.extra_data['last_name'] 
相關問題