Laravel Socialite - Đăng nhập bằng Google và Facebook

laravel socialite - Đăng nhập bằng google và facebook
Laravel cung cấp một cách thuận tiện rõ ràng để tích hợp đăng nhập xã hội vào dự án hiện tại của bạn một cách dễ dàng bằng cách sử dụng Laravel Socialite.Trong ví dụ này, mình sẽ hướng dẫn bạn cách đăng nhập bằng tài khoản google và facebook trên trang web laravel của bạn


  1. Bắt đầu cài đặt project laravel

Mình sẽ cài đặt dự án với phiên bản Laravel 10

composer create-project --prefer-dist laravel/laravel social-login

  1. Cài đặt cơ sở dữ liệu

Tạo cơ sở dữ liệu và cấu hình thông tin đăng nhập cơ sở dữ liệu trong tệp .env trong thư mục gốc của dự án laravel của bạn.

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=databasename

DB_USERNAME=user

DB_PASSWORD=password

  1. Cài đặt và cấu hình Laravel/Socialite

composer require laravel/socialite

Sau khi cài đặt thành công gói socialite, ở trong config/app.php hãy thêm vào aliases providers như sau:

    'providers' => ServiceProvider::defaultProviders()->merge([

        Laravel\Socialite\SocialiteServiceProvider::class,

    ])->toArray(),


    'aliases' => Facade::defaultAliases()->merge([

        // 'Example' => App\Facades\Example::class,

        'Socialite' => Laravel\Socialite\Facades\Socialite::class,

    ])->toArray(),

  1. Cấu hình thông tin đăng nhập Google trong Laravel

Truy cập config/services.php và dán mã bên dưới cho Google và Facebook hoặc các nhà cung cấp khác mà bạn muốn.


    'facebook' => [

        'client_id' => env('FACEBOOK_CLIENT_ID', ''),

        'client_secret' => env('FACEBOOK_CLIENT_SECRET', ''),

        'redirect' => env('FACEBOOK_REDIRECT'),

    ],


    'google' => [

        'client_id' => env('GOOGLE_CLIENT_ID', ''),

        'client_secret' => env('GOOGLE_CLIENT_SECRET', ''),

        'redirect' => env('GOOGLE_REDIRECT'),

    ],


Và, thông tin đăng nhập phải ở trong tệp .env sẽ giống như thế này.

FACEBOOK_CLIENT_ID=XXXXXXXXXXXXXXXXXXXXXXXX

FACEBOOK_CLIENT_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX

FACEBOOK_REDIRECT=http://localhost:8000/api/auth/facebook/callback


GOOGLE_CLIENT_ID=XXXXXXXXXXXXXXXXXXXXXXXX

GOOGLE_CLIENT_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX

GOOGLE_REDIRECT=http://localhost:8000/api/auth/google/callback


  1. Tạo migration

Ở migration tạo bảng users ta thêm 1 trường provider provider_id


use Illuminate\Database\Migrations\Migration;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;


return new class extends Migration

{

    /**

     * Run the migrations.

     */

    public function up(): void

    {

        Schema::create('users', function (Blueprint $table) {

            $table->id();

            $table->string('name');

            $table->string('email')->unique();

            $table->timestamp('email_verified_at')->nullable();

            $table->string('password');

            $table->string('provider')->nullable();

            $table->string('provider_id')->nullable();

            $table->rememberToken();

            $table->timestamps();

        });

    }


    /**

     * Reverse the migrations.

     */

    public function down(): void

    {

        Schema::dropIfExists('users');

    }

};



Update model User tại app/Models/User.php


namespace App\Models;


// use Illuminate\Contracts\Auth\MustVerifyEmail;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Notifications\Notifiable;

use Laravel\Sanctum\HasApiTokens;


class User extends Authenticatable

{

    use HasApiTokens, HasFactory, Notifiable;


    /**

     * The attributes that are mass assignable.

     *

     * @var array<int, string>

     */

    protected $fillable = [

        'name',

        'email',

        'password',

        'provider',

        'provider_id'

    ];


    /**

     * The attributes that should be hidden for serialization.

     *

     * @var array<int, string>

     */

    protected $hidden = [

        'password',

        'remember_token',

    ];


    /**

     * The attributes that should be cast.

     *

     * @var array<string, string>

     */

    protected $casts = [

        'email_verified_at' => 'datetime',

    ];

}



  1. Tạo routes cho việc đăng nhập Google/Facebook

Do mình viết api lên mình tạo route trong: routes/api.php


Route::group(['prefix' => 'auth'], function () {

    Route::get('{provider}', [SocialAuthController::class, 'loginUsingProvider'])->name('social.login');

    Route::get('{provider}/callback', [SocialAuthController::class, 'callbackFromProvider'])->name('social.callback');

});


Bây giờ hãy thêm chức năng này vào app/Http/Controllers/SocialAuthController.php của bạn :



namespace App\Http\Controllers;


use App\Models\User;

use Mockery\Exception;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;

use Illuminate\Support\Facades\Hash;

use Laravel\Socialite\Facades\Socialite;


class SocialAuthController extends Controller

{

    /**

    * Login Using Facebook/Google

    */

    public function loginUsingProvider($provider)

    {

       try {

            $url = Socialite::driver($provider)->stateless()

                ->redirect()->getTargetUrl();

            return response()->json([

                'url' => $url,

            ])->setStatusCode(Response::HTTP_OK);


        } catch (\Exception $e) {

            return $e;

        }


    }

   

    /**

    * Facebook/Google Callback

    */

    public function callbackFromProvider($provider)

    {

        try {

            $user = Socialite::driver($provider)->stateless()->user();


            // Check User Exists

            if(!$this->checkUserExist($user->getEmail())){


                $saveUser = User::create([

                    'name' => $user->getName(),

                    'email' => $user->getEmail(),

                    'password' => Hash::make($user->getName().'@'.$user->getId()),

                    'provider' => $provider,

                    'provider_id' => $user->getId()

                ]);


            }else{

                $saveUser = User::where('email',  $user->getEmail())->update([

                    'provider' => $provider,

                    'provider_id' => $user->getId(),

                ]);

            }


            Auth::loginUsingId($saveUser->id);


            return redirect()->route('home');


        } catch (\Exception $e) {

            throw new Exception($e->getMessage(), $e->getCode());

        }

    }


    //Check Users Email If Already There

    public function checkUserExist($email)

    {

        $user = User::where('email', $email)->first();

        if ($user) {

            return true;

        }


        return false;

    }

}


  1. Test với Postman

Gọi đến route với đường dẫn: "http://127.0.0.1:8000/api/auth/google" để lấy được url login.


Được rồi, vậy là xong , bạn đã triển khai thành công laravel socialite trong dự án của mình.


Cuối cùng, nếu bạn muốn thêm các nhà cung cấp dịch vụ đăng nhập khác thì chỉ cần thêm thông tin xác thực vào tệp .env và kích hoạt chúng config/service.php bằng cách thêm thông tin nhà cung cấp khác.