iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
佛心分享-IT 人自學之術

後端小白自學 Laravel系列 第 21

第 21 天:API 認證與授權

  • 分享至 

  • xImage
  •  

文件:Passport OAuth 认证

介紹 API 認證機制(如Token)


Token 認證是透過發送請求時附帶 Token 來識別使用者身分,常見於 RESTful API 中,Token 通常是 JWT 或 OAuth2 Token。

使用 Laravel Passport 進行 API 認證


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,通常在認證控制器中處理。

實現 API 的授權和訪問控制


  1. 使用中間件:
    在路由中使用 auth:api 中間件來保護需要認證的 API 路由:
    Route::middleware('auth:api')->get('/user', function (Request $request) {
        return $request->user();
    });
    
  2. 使用策略進行授權:
    建立和使用策略來控制使用者對資源的存取,以下是個範例:
    用指令 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

  1. 使用 composer require laravel/passport 安裝 Passport

  2. 發布 Passport 配置文件 php artisan passport:install 產生 Passport 所需的加密金鑰

  3. 配置 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 路由

  1. 定義 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']);
    
  2. 建立控制器
    指令 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

  1. 建立認證控制器
    指令 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);
        }
    }
    
  2. 定義登入路由
    routes/api.php 中新增登入路由:

    Route::post('/login', [AuthController::class, 'login']);
    

step 4 - 測試 API 認證

  1. 請求 Token
    使用 Postman 或其他 API 用戶端發送 POST 請求到 /api/login,提供有效的 emailpassword,成功後,將獲得一個 Token。

  2. 存取受保護的 API
    使用獲得的 Token 發送 GET 請求到 /api/profile,將 Token 新增至請求的 Authorization 頭部:

    Authorization: Bearer {your_token_here}
    

    你應該會收到用戶的個人資料作為回應。

step 5 - 實作 API 授權

  1. 創建策略
    指令 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;
        }
    }
    
  2. 註冊策略
    app/Providers/AuthServiceProvider.php 中注册策略:

    protected $policies = [
        \App\Models\Post::class => \App\Policies\PostPolicy::class,
    ];
    
  3. 使用策略
    在控制器中使用策略來檢查授權:

    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);
    }
    

上一篇
第 20 天:服務提供者
下一篇
第 22 天:前後端交互 - API 開發與集成
系列文
後端小白自學 Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言