我一直试图让Facebook登录为我的Django应用程序工作。我有一个自定义用户,除了似乎在Facebook身份验证后,Facebook只传回用户的用户名,而我想要用户名,电子邮件,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 :(得分: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']