Composer 使用 JWT 生成 TOKEN 例項

994914376發表於2018-03-26

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

以上就是使用過程,希望能對你有所幫助。歡迎留言討論

相關文章