是 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']);
});