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
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
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 và 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(),
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
Tạo migration
Ở migration tạo bảng users ta thêm 1 trường provider và 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',
];
}
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;
}
}
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.