martes, 15 de diciembre de 2015

25 - Tutorial de Laravel 5 - OAuth2 Socialite (Registrar y autenticar al usuario)




En este capítulo del Tutorial de Laravel 5 continuamos dándole forma a la autenticación y registro de usuarios a través de proveedores como Facebook y Google, este capítulo es la continuación del anterior.

Para empezar realizamos una modificación en la tabla "users" agregándole una nueva columna llamada "social" del tipo BOOLEAN y con valor por defecto 0 (false). Esta columna nos permitirá determinar saber si el usuario autenticado es un usuario registrado de forma normal o a través de un proveedor de servicios. También editaremos la columna "password" de la tabla "users" permitiendo valores nulos.

Crearemos una nueva tabla con artisan llamada "user_social_accounts" en la cual guardaremos información extra de los usuarios, tales como el id de registro del usuario de la tabla "users", el proveedor y el id del proveedor.

Abrir una consola, ir a la raiz del proyecto Laravel y ejecutar el siguiente comando para crear la clase ...

php artisan make:migration user_social_accounts --create=user_social_accounts


En la carpeta "database\migrations" se ha generado un nuevo archivo "xxx_user_social_accounts.php", abrirlo y agregar el método up() el siguiente código ...

        Schema::create('user_social_accounts', function (Blueprint $table) {
            $table->increments('id');
	    $table->integer('user_id');
	    $table->string('provider');
	    $table->string('uid_provider');
        });


Guardar el archivo, regresar a la consola y realizar la migración con el siguiente comando ...

php artisan migrate


A continuación crearemos un modelo que nos permita utilizar eloquent para esta nueva tabla, en la carpeta "app" crearemos un nuevo archivo llamado "Social.php" y le agregaremos el siguiente código ...

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Social extends Model
{
    protected $table = 'user_social_accounts';
    public $timestamps = false;
}


A continuación nos dirigimos al controlador que creamos en el capítulo anterior SocialController para realizar las modificaciones necesarias para la acción que recibe la respuesta del proveedor con la información del usuario, primero agregamos el nuevo modelo: 

use App\Social;

Y luego modificamos la acción getSocialAuthCallback ...

  public function getSocialAuthCallback($provider=null)
       {
          if($user = Socialite::driver($provider)->user()){
			  
             if ($the_user = User::select()->where('email', '=', $user->email)->first())
			 {
				 Auth::login($the_user);
			 }	else{
				 $new_user = new User;
				 $new_user->name = $user->name;
				 $new_user->email = $user->email;
				 $new_user->perfiles = $user->avatar;
				 $new_user->active = 1;
				 $new_user->social = 1;
				 $new_user->save();
				 Auth::login($new_user);
				 
				 //Registrar Información extra
				 $social = new Social;
				 $social->user_id = $new_user->id;
				 $social->provider = $provider;
				 $social->uid_provider = $user->id;
				 $social->save();
			 }
			 return redirect('home');
          }else{
             return '¡¡¡Algo fue mal!!!';
          }
       }


En esta acción comprobamos primeramente si hemos podido obtener información del usuario, si es así, comprobamos si se encuentra registrado en la tabla "users" a través de su email, de ser así, autenticamos el usuario, de lo contrario, si el usuario no se encuentra registrado, lo registramos y lo autenticamos y guardamos la información extra del usuario en la nueva tabla "user_social_accounts".

Ahora realicen la prueba de registrarse en la aplicación a través de Facebook y Google. Otra cosa que se muestra en el vídeo es como establecer a través de una condición si el usuario es registrado normal o a través de un proveedor, el ejemplo se muestra en la vista user.blade.php que muestra el panel de usuario, donde se muestran distintas opciones, entre ellas la posibilidad de cambiar el password, para el caso de los usuarios autenticados a través de un proveedor, esta opción no debe estar disponible, de modo que con una simple condición podemos mostrar o no la opción de cambiar el password ...

	@if(Auth::user()->social == 0)
    <li><a href="{{url('user/password')}}">Cambiar mi password</a></li>
	@endif


Como pueden ver en esta condición entra en juego la columna "social", 0 es para usuarios registrados de forma normal y 1 para usuarios registrados a través de un proveedor.




1 comentario:

Web Development Service in India dijo...

Esto es realmente un puesto informativo maravilloso. Muchas gracias por compartir.