Token 認證是透過發送請求時附帶 Token 來識別使用者身分,常見於 RESTful API 中,Token 通常是 JWT 或 OAuth2 Token。
step 1 - 安裝 Passport
composer require laravel/passport
php artisan passport:install
step 2 - 在 AuthServiceProvider
中註冊 Passport
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
step 3 - 設定 API 認證
在 config/auth.php
檔案中,將 api 驅動設定為 passport:
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
step 4 - 建立和配置模型
確保 User
模型實作了 Laravel\Passport\HasApiTokens
:
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
step 5 - 請求 Token
使用 Laravel Passport 提供的 /oauth/token
端點來請求 Token,通常在認證控制器中處理。
auth:api
中間件來保護需要認證的 API 路由:
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
php artisan make:policy PostPolicy
建立一個策略 PostPolicy
中定義方法:
public function view(User $user, Post $post)
{
return $user->id === $post->user_id;
}
在 AuthServiceProvider
中註冊策略:
protected $policies = [
Post::class => PostPolicy::class,
];
使用策略來控制對 Post
模型的存取:
if (Gate::allows('view', $post)) {
// The current user can view the post...
}
使用 Laravel Passport 實現 Token 認證。
step 1 - 安裝與配置 Laravel Passport
使用 composer require laravel/passport
安裝 Passport
發布 Passport 配置文件 php artisan passport:install
產生 Passport 所需的加密金鑰
配置 Passport
註冊 Passport:
在 app/Providers/AuthServiceProvider.php
中註冊 Passport 路由:
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
配置 API 認證驅動:
在 config/auth.php
檔案中,將 api
驅動設定為 passport
:
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
更新 User 模型:
確保 User
模型使用 HasApiTokens
trait:
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
step 2 - 建立和配置 API 路由
定義 API 路由
在 routes/api.php
檔案中定義受保護的 API 路由:
use App\Http\Controllers\ProfileController;
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::middleware('auth:api')->get('/profile', [ProfileController::class, 'show']);
建立控制器
指令 php artisan make:controller ProfileController
建立 ProfileController
處理受保護的路由,並在 app/Http/Controllers/ProfileController.php
中添加方法
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
public function show(Request $request)
{
return $request->user();
}
}
step 3 - 建立 API 認證和請求 Token
建立認證控制器
指令 php artisan make:controller AuthController
建立 AuthController
用於處理使用者認證和取得 Token,在 app/Http/Controllers/AuthController.php
中添加方法:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$user = Auth::user();
$token = $user->createToken('Personal Access Token')->plainTextToken;
return response()->json(['token' => $token]);
}
return response()->json(['error' => 'Unauthorized'], 401);
}
}
定義登入路由
在 routes/api.php
中新增登入路由:
Route::post('/login', [AuthController::class, 'login']);
step 4 - 測試 API 認證
請求 Token
使用 Postman 或其他 API 用戶端發送 POST 請求到 /api/login
,提供有效的 email
和 password
,成功後,將獲得一個 Token。
存取受保護的 API
使用獲得的 Token 發送 GET 請求到 /api/profile
,將 Token 新增至請求的 Authorization
頭部:
Authorization: Bearer {your_token_here}
你應該會收到用戶的個人資料作為回應。
step 5 - 實作 API 授權
創建策略
指令 php artisan make:policy PostPolicy
,並且在 app/Policies/PostPolicy.php
中定義授權邏輯:
namespace App\Policies;
use App\Models\User;
use App\Models\Post;
use Illuminate\Auth\Access\HandlesAuthorization;
class PostPolicy
{
use HandlesAuthorization;
public function view(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}
註冊策略
在 app/Providers/AuthServiceProvider.php
中注册策略:
protected $policies = [
\App\Models\Post::class => \App\Policies\PostPolicy::class,
];
使用策略
在控制器中使用策略來檢查授權:
use Illuminate\Support\Facades\Gate;
public function show(Post $post)
{
if (Gate::allows('view', $post)) {
return response()->json($post);
}
return response()->json(['error' => 'Forbidden'], 403);
}