iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
自我挑戰組

PHP 沿途的風景系列 第 27

[Day 27] Call API use JWT in Laravel: 簡介 和 安裝

  • 分享至 

  • xImage
  •  

Call API use JWT in Laravel: 簡介 和 安裝

本文重心放在前後端分離時,使用 JWT(JSON Web Token)驗證 (Authentication) 使用者身份的機制,以及如何使用 Laravel JWT Package: jwt-auth/Laravel

前後端不分離的情況 - 登入為例

  • 使用者提供資訊 (帳號, 密碼) 經過 Server 驗證後,驗證成功,Server 會為使用者提供 Session,並在 Server 儲存 Session。
  • 以及,通常會回傳一個含有 Session ID 的 Cookie 給使用者。
  • 之後,使用者每發出一個請求 (Request),這個 Request 包含 Session ID
  • Server 每次接收到的 Request ,皆會確認 Session ID 正確與否後,若正確,才會回傳 (Response) 給使用者
  • 如果 Server 確認 Cookie 之中的 Session ID 過期錯誤 ,Server 要求 使用者 重新登入

前後端分離 Call API - 登入為例:

前後端分離,通常使用 JWT(JSON Web Token)等無狀態的 token 機制 替代 Session ,作為 使用者身份驗證的授權 (Authentication) 機制,所謂無狀態驗證指的是不需要透過 DB 就可以驗證 Token 是否正確。

  • 使用者提供 Request (資訊: 帳號, 信箱..等) 經過 Server 收到 Request 之後,去 DB 做驗證,確定驗證成功之後,Server 用 secret 建立一組 token (JWT) 回傳給使用者 (Client 端)
    • Server 提供使用者 JWT 方式,以 Laravel package - jwt-auth/Laravel 為例: $token = auth()->attempt($credentials);
  • 這組 JWT 已經儲存關於使用者所有的資訊
  • 因此,Server 將 JWT 送回給使用者 (瀏覽器),瀏覽器可以選擇儲存 JWT
  • 此時,使用者 (瀏覽器) 發送 Request ,並且確保 Request 含有 JWT ,以便 Server 知道使用者正在用什麼方式進行 身份驗證
  • Server 透過 secret 對 JWT 進行 Signature,驗證此 JWT 未被更改
  • 若此 JWT 被使用者更改,則 Server 會知道此 JWT 是無效的
  • 如圖 (圖引用: What Is JWT and Why Should You Use JWT)

JWT 和 Session 差異:

  • JWT:
    • JWT 是無狀態的, Server 會為使用者提供 JWT,並不會在 Server內 儲存 JWT,使用者的資訊皆存在 JWT。換句話說,Server 提供的 JWT 儲存在 使用者 (瀏覽器-localStorage),Server 不會記住 使用者的任何資訊。
    • JWT 讓資料是經過 hash 過的,也可以 decode hash 的資料
    • JWT 的組成,參考 jwt.io,用 . 將JWT token 分成三個部份 :
      • Header: 指這個 Token 如何被產生出來,使用哪一種演算法、型態 (ALGORITHM: HS256 & TOKEN TYPE: JWT 組成)
      • Payload: DATA (name, email..etc, whatever you want.)
      • Signature: 編譯後的 Header、Payload 與 secret 透過 hash 所產生 (VERIFY SIGNATURE: HMACSHA256)

  • Session:
    • Server 會為使用者提供 Session,並在 Server 儲存 Session,Server 透過 Session ID 才能找到 使用者資訊。

Laravel Composer Install JWT

在 Laravel 下載 JWT套件 流程,參照 jwt-auth 網站的 Installation and Quick start

jwt-auth/Laravel Installation:

  • Install via composer: composer require tymon/jwt-auth
  • Publish the config:
    • 可做,也可不做。新增 JWT 細部設定檔案 config/jwt.php,JWT 細部設定,諸如: JWT 驗證密鑰 (JWT Authentication Secret), JWT 到期時間設置 (JWT TTL), JWT Authentication Secret..等
    • 指令: php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
    • 不做 Publish the config,JWT 細部設定參照 預設
  • 建立 JWT 密鑰 (Generate secret key): php artisan jwt:secret
    • 產生的 JWT密鑰 自動儲存於 .env 檔

結語

關於 jwt-auth/Quick start 下篇文章再講,Quick start 講解: 使用者提供 Request (資訊: 帳號, 信箱, 電話…等) 經過 Server 收到 Request 之後,去 DB 做驗證,確定驗證成功之後,Server 用 secret 建立一組 token (JWT) 回傳給使用者 (Client 端)。


參考文章

1 What Is JWT and Why Should You Use JWT
2 jwt.io
3 jwt-auth

是誰在敲打我窗?什麼是 JWT ?


上一篇
[Day 26] 箭頭函式 Arrow Functions
下一篇
[Day 28] Call API use JWT in Laravel: Quick start
系列文
PHP 沿途的風景30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言