是 Laravel 提供的一個非常方便的套件,專門用來處理第三方登入的功能,像是 Google、Facebook、GitHub、Line 等各種平台的 OAuth 認證流程。
使用 Socialite 讓開發者能夠簡單實作這些平台的登入,免去自己手動處理繁瑣的 OAuth 認證邏輯。
它的作用是幫你處理跟第三方平台的對接,包括生成登入連結、接收授權碼、拿取使用者資料等。
當使用者成功登入後,你可以取得他們的資料,例如:email、名字、大頭貼等,然後決定要讓他登入還是幫他註冊新帳號。
composer require laravel/socialite
composer require socialiteproviders/line
'line' => [
'client_id' => env('LINE_CLIENT_ID'),
'client_secret' => env('LINE_CLIENT_SECRET'),
'redirect' => env('LINE_REDIRECT_URI'),
],
每個第三方平台都會提供給你一組 client_id 和 client_secret(也就是應用程式的身份憑證)。
你需要到這些平台的開發者後台註冊應用程式,然後把憑證填到 .env 檔案。
LINE_CLIENT_ID=你的-Line-Channel-ID
LINE_CLIENT_SECRET=你的-Line-Channel-Secret
LINE_REDIRECT_URI=http://你的網站.com/auth/line/callback
在 users 表中新增一個 line_id 欄位來儲存 Line 的使用者 ID。
這樣可以追蹤使用者是否透過 Line 登入。
php artisan make:migration add_line_id_to_users_table --table=users
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('line_id')->nullable()->unique();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('line_id');
});
}
執行 Migration:
php artisan migrate
已經有 AuthController
使用 JWT 進行身份驗證,要處理 Line 第三方登入目前想到有以下 2 個方法做選擇。
我覺得新增一個 LineLoginController
專門處理 Line 登入相關的邏輯比較好維護,Controller 也比較不會太肥XD
但大家可以依照自己的需求選擇適合的方法。
php artisan make:controller LineLoginController
在 LineLoginController 加入以下方法:
<?php
namespace App\Http\Controllers;
use Laravel\Socialite\Facades\Socialite;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Tymon\JWTAuth\Facades\JWTAuth;
class LineLoginController extends Controller
{
// 導向到 Line 登入頁面
public function redirectToLine()
{
// 使用 Socialite 驅動的 'line' 來處理重定向到 Line 的登入頁面
return Socialite::driver('line')->redirect();
}
// Line 登入後的回調邏輯
public function handleLineCallback()
{
try {
// 從 Line 回調中取得使用者資料
$lineUser = Socialite::driver('line')->user();
// 根據 Line ID 查找是否已有會員帳號
$user = User::where('line_id', $lineUser->id)->first();
if (!$user) {
// 如果會員帳號不存在,則創建新會員帳號
$user = User::create([
'name' => $lineUser->name, // 使用 Line 的名稱
'email' => $lineUser->email, // 使用 Line 提供的電子郵件
'line_id' => $lineUser->id, // 將 Line 的 ID 存入資料庫
'role' => '一般會員', // 預設為一般會員
]);
}
// 使用 JWT 與該使用者對應的 token 來進行登入
$token = JWTAuth::fromUser($user);
// 回傳包含 token 的 JSON 回應
return response()->json(['token' => $token]);
} catch (\Exception $e) {
// 如果有任何錯誤,回傳錯誤訊息
return response()->json(['error' => 'Line 登入失敗', 'message' => $e->getMessage()], 500);
}
}
}
driver('line') 是在告訴 Socialite,我這次要處理的是 Line 的登入,請幫我準備好相關設定。
簡單來說,就是在設定好 Line 登入的「通道」,準備接下來把使用者送去 Line 的登入畫面,讓他們授權。
->user() 是用來處理當使用者完成 Line 授權後,去 Line 那邊把使用者的資料拿回來。
這裡的資料可能包含使用者的名字、email、Line 的 ID 等等。
流程大概是這樣:
可能會有很多原因導致無法取得使用者的資料,但一開始又不曉得是什麼原因導致錯誤,需要很有耐心的一一排查><
明天測試時可以再跟大家分享一下我排查的過程。(拭淚)
在 routes/web.php 中定義兩個路由:
use App\Http\Controllers\LineLoginController;
Route::middleware(['web'])->group(function () {
Route::get('/login/line', [LineLoginController::class, 'redirectToLine']);
Route::get('/login/line/callback', [LineLoginController::class, 'handleLineCallback']);
});