如何使用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}");
留言
張貼留言