Mostrando entradas con la etiqueta Socialite. Mostrar todas las entradas
Mostrando entradas con la etiqueta Socialite. Mostrar todas las entradas

Login Redes Sociales: guardar en la BD una vez logueado en una red social

php artisan make:model SocialProfile -m
Lo primero en el migrate de user poner nullable el password:
$table->string('password')->nullable();
En el nuevo migration de SocialProfile creado añadir:
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->string('social_id')->unique();
$table->string('social_name');
$table->string('social_avatar');

Pasar el migrate para generar de nuevo todas las tablas:
php artisan migrate:fresh
En el modelo User:
use App\SocialProfile;
...
public function socialProfiles() { // es profiles pq un user puede tener varios (facebook, google, twitter, etc)
        return $this->hasMany(SocialProfile::class);
    }

En el modelo SocialProfile:
use App\User;
...
protected $fillable = ['user_id', 'social_id', 'social_name', 'social_avatar'];
...

public function user() {
        $this->belongsTo(User::class);
    }

En SocialAuthController.php:
public function callbackFacebook(Request $request) {
        if ($request->get('error')) { // por ejemplo al dar a cancelar cuando se loguea con facebook
           return redirect()->route('login');
        }

        $userSocialite = Socialite::driver('facebook')->user();
        // check si ese email está ya dado de alta
        $user = User::where('email', $userSocialite->getEmail())->first();
        if (!$user) {
            $user = User::create([
                'name' => $userSocialite->getName(),
                'email' => $userSocialite->getEmail(),
               ]);
        }

        // check que ese social_id ya no esté metido de antes
        $socialProfile = SocialProfile::where('social_id',$userSocialite->getId())
                        ->where('social_name', 'Facebook')->first();
       if (!$socialProfile) {
            $socialProfile = SocialProfile::create([
                    'user_id' => $user->id,
                    'social_id' => $userSocialite->getId(),
                    'social_name' => 'Facebook',
                    'social_avatar' => $userSocialite->getAvatar(),
            ]);       }
       // una vez metido o no metido (por estar de antes) vamos a loguearlo
       auth()->login($user);
       return redirect()->route('home');
    }

Login Redes Sociales

En la consola del terminal:
composer require laravel/socialite

Crear un controlador para las redes sociales:
php artisan make:controller SocialAuthController

En config/services.php:
'facebook' => [
        'client_id' => 'xxx',
        'client_secret' => 'xxx',
        'redirect' => 'http://localhost/LARAVEL/laravel_edc/public/back_facebook',
    ],

'twitter' => [
        'client_id' => 'xxx',
        'client_secret' => 'xxx',
        'redirect' => 'http://localhost/LARAVEL/laravel_edc/public/back_twitter',
    ],

'linkedin' => [
        'client_id' => 'xxx',
        'client_secret' => 'xxx',
        'redirect' => 'http://localhost/LARAVEL/laravel_edc/public/back_linkedin',
    ],


En config/app.php:
En providers:
Laravel\Socialite\SocialiteServiceProvider::class,
En aliases:
'Socialite' => Laravel\Socialite\Facades\Socialite::class,

IMPORTANTE: Aunque tu IDE te ponga error al incluir Socialite no hacer caso, funciona perfectamente.

Crear tu App en los developers de Facebook, Twitter y Linkedin (no olvidar la ruta del callback)

En routes/web.php:
Route::get('/login_facebook', 'SocialAuthController@loginFacebook');
Route::get('/back_facebook', 'SocialAuthController@callbackFacebook');

Route::get('/login_twitter', 'SocialAuthController@loginTwitter');
Route::get('/back_twitter', 'SocialAuthController@callbackTwitter');

Route::get('/login_linkedin', 'SocialAuthController@loginLinkedin');
Route::get('/back_linkedin', 'SocialAuthController@callbackLinkedin');

En SocialAuthController.php:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Laravel\Socialite\Facades\Socialite;

class SocialAuthController extends Controller
{
    public function loginFacebook() {
        return Socialite::driver('facebook')->redirect();
    }

    public function callbackFacebook() {
        $user = Socialite::driver('facebook')->user();
        print_r($user);exit;
    }

    public function loginTwitter() {
        return Socialite::driver('twitter')->redirect();
    }

    public function callbackTwitter() {
        $user = Socialite::driver('twitter')->user();
        print_r($user);exit;
    }

    public function loginLinkedin() {
        return Socialite::driver('linkedin')->redirect();
    }

    public function callbackLinkedin() {
        $user = Socialite::driver('linkedin')->user();
        print_r($user);exit;
    }
}


IMPORTANTE: En https://developers.facebook.com si vamos a probarlo desde localhost es configuración->Información básica.

Pero si ya se va a hacer desde un servidor real con https hay que rellenar también Inicio de sesión de Facebook -> Configuración -> URL de devolución de llamada de retirada de autorización.

En Facebook puedes hacer todas las pruebas que quieras con tu usuario pero para probar ya con otro tendrás q pasar la App de "En desarrollo" a "En Producción". Más información en el minuto final del vídeo: https://www.youtube.com/watch?v=OtXQJWK_MXs