如何使用JWT?



JWT(JSON Web Tokens),是一種基於JSON 的開放標準RFC 7519進行傳遞訊息的方式。JWT是由Header、Payload、Signature所組成為一串字串,因此JWT最後會像是xxxx.yyyyy.zzzzz。


Header

Header包含雜湊演算法類型及token的種類,Freshdesk用的是RS256。

{ "alg": "RS256", "typ": "JWT"}

Playload

Playload包含身份資訊或是其他要傳遞的資訊。雖然被編譯過,但依舊能轉換回來,因此建議不要將密碼等隱私資料放到JWT的Header、Playload中。

{
    "sub": "1234567890",
    "email": "messi@awesomecompany.com",
    "nonce": "123422"
}

Signature

要建立Signature,需透過編碼後的Header、Playload與私鑰產生。

# generate RSA key
ssh-keygen -t rsa -b 1024 -m PEM -f jwtRS256.key
# use empty passphrase
openssl rsa -in jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub

JWT SSO流程

  • 使用者嘗試登入Freshworks帳戶。
  • Freshworks判斷該用戶使用JWT SSO進行登入,用戶將被導向驗證身份的網址,以及client_id、state 和 nonce的請求參數。
  • 驗證用戶身份。
  • 身份提供者驗證用戶身份並產生JWT。
  • 將產生的JWT回傳Freshworks。
  • Freshworks驗證JWT(公鑰私鑰)是否正確,如果有效便會用Token中使用者的身份登入。

實作

用的是PHP-JWT提供的套件來設定JWT參數。

$pkeyid = [私鑰];

$payload = array(
    'sub' => $Worker_ERPID,
    'email' => $Email,
    'iat' => $_SERVER['REQUEST_TIME'],
    'nonce' => $_GET['nonce'],
    'given_name' => $First_Name,
    'family_name' => $Last_Name
);

# 使用JWT RS256編碼
$jwt = JWT::encode($payload, $pkeyid, 'RS256');

把設定SSO with JWT的Redirect URL再加上剛剛產生的JWT就行了。

$RedirectURL = [重新導向網址];

header("Location: {$RedirectURL}?state={$_GET['state']}&id_token={$jwt}");

留言