Cansada de ser feliz

Bienvenidos a mi flujo de conciencia

Login con Facebook en Django

| Comments

Este ejemplo fue probado con la versión 1.10 de Django.

Primero instalamos las siguentes dos librerías que hacen parte del proyecto Python Social Auth:

1
2
$ pip install social-auth-core
$ pip install social-auth-app-django

Agregamos la aplicación social_django a la lista INSTALLED_APPS del archivo settings.py en nuestro proyecto de Django:

1
2
3
INSTALLED_APPS = [
    'social_django',
]

Especificamos en AUTHENTICATION_BACKENDS que vamos a usar un backend adicional para ingresar con la cuenta de Facebook:

1
2
3
4
5
AUTHENTICATION_BACKENDS = [
    'social_core.backends.facebook.FacebookOAuth2',

    'django.contrib.auth.backends.ModelBackend',
]

y finalmente agregamos los procesadores de contexto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
TEMPLATES = [
    {
        ...
        'OPTIONS': {
            ...
            'context_processors': [
                ...
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
                ...
            ]
        }
    }
]

Ahora podemos correr las migraciónes para crear las tablas que usa social_django para guargar las cuentas y relaciones con los usuarios de Django que ya tenemos:

1
2
3
4
5
6
7
8
$ ./manage.py migrate
Running migrations:
  Applying social_django.0001_initial... OK
  Applying social_django.0002_add_related_name... OK
  Applying social_django.0003_alter_email_max_length... OK
  Applying social_django.0004_auto_20160423_0400... OK
  Applying social_django.0005_auto_20160727_2333... OK
  Applying social_django.0006_partial... OK

Agregamos las urls de social_django en urls.py:

1
url('', include('social_django.urls', namespace='social')),

Listo, con esto podemos agregar un enlace en alguna de nuestras plantillas:

templates/base.html
1
<a href="{% url 'social:begin' 'facebook' %}?next={{ request.path }}">Login con Facebook</a>

Especificamos que queremos asociar usuarios que ingresan con Facebook a nuestros usuario de Django por medio de correo electrónico:

1
2
3
4
5
6
7
8
9
10
11
12
SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'social_core.pipeline.social_auth.auth_allowed',
    'social_core.pipeline.social_auth.social_user',
    'social_core.pipeline.user.get_username',
    'social_core.pipeline.social_auth.associate_by_email',  # <--- este
    'social_core.pipeline.user.create_user',
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
)

Es decir: cuando un usuario va a ingresar a nuestra página con su cuenta de Facebook, la aplicación va a mirar si en la tabla de usuario ya existe uno con el mismo correo, y si es así, simplemente lo asocia al la cuenta de Facebook con la que el usuario ingresó. En el caso opuesto, se crea un nuevo registro en la tabla users.

Ahora tenemos que crear la aplicación de Facebook desde la página developers.facebook.com. Luego agregamos el servicio de “Facebook Login”:

Copiamos las llaves de la aplicación

y los pegamos en el archivo de configuración de Django:

settings.py
1
2
SOCIAL_AUTH_FACEBOOK_KEY = 'app-id'
SOCIAL_AUTH_FACEBOOK_SECRET = 'app-secret'

Después de hacer los pasos anteriores, al momento de hacer click en “Login con Facebook”, la aplicación nos va a redirigir a la siguiente página:

Pero nosotros, al momento de login queremos obtener correo electrónico de nuestro usuario, por eso definimos el scope:

settings.py
1
2
3
4
SOCIAL_AUTH_FACEBOOK_IGNORE_DEFAULT_SCOPE = True
SOCIAL_AUTH_FACEBOOK_SCOPE = [
    'email'
]

Y ahora sí, la aplicación pide acceso al correo electrónico:

Entramos en el administrador de Django y podemos ver que se creó un registro asociando al usuario que ya existía en la base de datos a su cuenta de Facebook:

Enlaces:

Comments