1、Token和Session的區別?
SESSION 是伺服器通過 Key-Value 對來儲存資料的一種機制,比如 APP 的登入狀態可以用 SESSION 來儲存。
TOKEN 翻譯過來叫令牌,令牌是什麼意思?可以拿現實中的令牌對比,現實中的令牌起到通行證的作用,而這在服務端也是一樣的。我們在登入後,服務端使用 SESSION 儲存我們的登入狀態,並把 SESSION 的 Key 返回給客戶端,那麼這個 Key 就成為我們的令牌(TOKEN),我們以後再訪問資料,就直接把這個 TOKEN 隨著請求一起傳送給服務端,這樣服務端通過這個 TOKEN 在 SESSION 中查詢資料,如果有就說明 TOKEN 有效(就像你去旅遊,關口認可你的通行證),並取出你的登入資料,利用你的使用者資訊(儲存在登入資料內)查出你想要的內容。
2、APP為什麼使用Token而不使用Session
相較於Session而言,每一次的會話操作都會對伺服器造成壓力。
Token的目的是為了減輕伺服器的壓力,減少頻繁的查詢資料庫,使伺服器更加健壯。
3、Token在與客戶端互動流程
1:客戶端通過使用者名稱和密碼登入
2:伺服器驗證使用者名稱和密碼,若通過,生成token返回給客戶端。
3:客戶端收到token後以後每次請求的時候都帶上這個token,相當於一個令牌,表示我有許可權訪問了
4:伺服器接收(通常在攔截器中實現)到該token,然後驗證該token的合法性(為什麼能驗證下面說)。
注:若該token合法,則通過請求,若token不合法或者過期,返回請求失敗。
4、如何來生成Token 使用composer載入包lcobucci/jwt
composer require lcobucci/jwt
5、Token的格式
分為請求頭 heard
{
"alg": "HS256",
"typ": "JWT"
}
儲存的內容
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
加鹽字串
6、下面使用PHP來建立Token
<?php
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\ValidationData;
use \Exception;
class Token
{
/**
* 建立Token
* @param $uid 需要儲存的使用者身份標識
* @return String
**/
public static function createToken($uid = null)
{
$signer = new Sha256();
$token = (new Builder())->setIssuer('https://www.baidu.com')
->setAudience('httpsp://www.baidu.com')
->setId('sxs-4f1g23a12aa', true) //自定義標識
->setIssuedAt(time()) //當前時間
->setExpiration(time() + (86400 * 30)) //token有效期時長
->set('uid', $uid)
->sign($signer, '你的加鹽字串')
->getToken();
//這裡可以做一些其它的操作,例如把Token放入到Redis記憶體裡面快取起來。
/**
* ......
* ......
**/
return (String) $token;
}
/**
* 檢測Token是否過期與篡改
* @param token
* @return boolean
**/
public static function validateToken($tokan = null)
{
$token = (new Parser())->parse((String) $token);
$signer = Sha256();
if (!$token->verify($signer, '建立時候的加鹽字串')) {
return false; //簽名不正確
}
$validationData = new ValidationData();
$validationData->setIssuer('https://www.baidu.com');
$validationData->setAudience('https://www.baidu.com');
$validatationData->setId('sxs-4f1g23a12aa');//自字義標識
return $token->validate($validationData);
}
}
TokenController呼叫實現
Class TokenController
{
public function create()
{
$token = Token::createToken(1);
var_dump($token);
}
public function validate($token)
{
$bool = Token::validateToken($token);
var_dump($bool);
}
}
以上就是使用過程,希望能對你有所幫助。歡迎留言討論