2016-07-04 5 views
0

私はDjangoアプリケーションで動作するFacebookログインを取得しようとしています。 Facebookの認証時には、ユーザー名、電子メール、ファーストネーム、ラストネーム、プロフィール画像が必要ですが、Facebookはユーザーのユーザー名を返すように見えることを除いて、私はカスタムユーザーを持っています。私が持っているもう一つの問題は、認証が成功すると、私のアプリは単に'#_=_'で元のURLに戻ります。Django Social Authアクセスfirst_nameとlast_name

私の最大の問題は、私が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'] 
関連する問題