1. 程式人生 > >JSON Web Token 使用詳解

JSON Web Token 使用詳解

JWT是什麼?

JSON Web Token(縮寫 JWT)是目前最流行的<font color='red'>跨域</font>認證解決方案。它是有三部分組成,示例如下,具體的講解如下(jwt是不會有空行的,下面只是為了顯示,便使用了換行看著比較方便)。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjMfQ.

SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

它是由一個"."號隔開、三部分組成。 第一部分是header資訊,

{
  "alg": "HS256",// 加密的演算法
  "typ": "JWT"// 加密的方式,填寫JWT
}

第二部分是Payload,有固定的六個部分和自定義資料組成,自定義資料看自己的情況需要來定義,是可以省去的。

'iss' => 'https://www.qqdeveloper.com',// 簽發人
'exp' => time() + 86400,// 過期時間(這裡的有效期時間為1天)
'sub' => '主題內容',// 主題
'aud' => '受眾內容',// 受眾
'nbf' => $time,// 生效時間
'iat' => $time,// 簽發時間
'jti' => 123,// 編號

第三部分是Signature(是對前兩部分加密得來的)。由於前兩部分是公開透明的資料,因此防止資料的篡改和洩露,我們需要加密處理。首先,需要指定一個金鑰(secret)。這個金鑰只有伺服器才知道,不能洩露給使用者。然後,使用 Header 裡面指定的簽名演算法(預設是 HMAC SHA256),按照下面的公式產生簽名。

第一部分的加密方式(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

最終生成的就是上面很長的一段字串了。

為什麼會使用JWT

這就需要從我們傳統的認證模式來說了,傳統的認證模式是基於session和cookie來實現使用者的認證和鑑權。具體的流程模式如下圖。

<center>(圖一)Session與Cookie認證與鑑權</center> 1.客戶端向服務端傳送一個http請求。

2.服務端在收到客戶端的請求時,生成一個唯一的sessionid,<font color='red'>這裡需要將該生成的session儲存在服務端</font>,這個sessionid儲存具體的session內容,預設的是檔案儲存,當然我們可以修改具體的儲存方式,例如資料庫儲存。 3.客戶端在接受到這個sessionid時,存在cookie裡面,每次請求時攜帶該sessionid。 4.服務端在接收到客戶端的請求之後,根據客戶端傳送的sessionid來進行認證與授權。 這裡也推薦一下自己之前分享的一篇有關session於cookie的知識點。session與cookie詳解

<center>(圖二)傳統的token授權</center> 1.客戶端向服務端傳送一個http請求。

2.服務端在收到客戶端的請求之後,生成一個唯一token,<font color='red'>這裡需要將該生成的token儲存在服務端</font>,至於怎麼存,可以和上面session與cookie的方式一致。也可以存在快取資料庫中,如redis,memcached。 3.服務端將該token返回給客戶端,客戶端存在本地,可以存請求頭header中,也可以存在cookie中,同時也可以存在localstorage中。 4.向服務端傳送請求時,攜帶該token,服務端進行認證或者授權。

<center>(圖三)JWT認證模式</center> 1.客戶端向服務端傳送一個http請求。

2.服務端根據jwt的生成規則,生成一個token,並返回給客戶端,<font color='red'>這裡服務端是不需要儲存的</font>。 3.客戶端在接受到該token時,存在客戶端。 4.客戶端向服務端傳送請求時,服務端對請求的token進行解析,如果發現解析出來的資料和生成的資料是一致的代表是一個合法的token,則進行相應的操作。

基於session和cookie的認證和鑑權模式有什麼好與不好的地方呢?總結如下幾點:

通過上面幾張圖,我們也大致可以看得出來,基於session都是需要服務端儲存的,而JWT是不需要服務端來儲存的。針對以上幾點,總結如下: 一、缺點 1.容易遇到跨域問題。不同域名下是無法通過session直接來做到認證和鑑權的。 2.分散式部署的系統,需要使用共享session機制 3.容易出現csrf問題。

二、優點 1.方便靈活,伺服器端直接建立一個sessionid,下發給客戶端,客戶端請求攜帶sessionid即可。 2.session儲存在服務端,更加安全。 3.便於服務端清除session,讓使用者重新授權一次。

JWT與session有什麼區別呢?

JWT是基於客戶端儲存的一種認證方式,然而session是基於服務端儲存的一種認證方式。JWT雖然不用服務端儲存了,也可以避免跨域、csrf等情況。但也存在如下幾個不太好的地方。 1.無法清除認證token。由於JWT生成的token都是儲存在客戶端的,不能有服務端去主動清除,只有直到失效時間到了才能清除。除非服務端的邏輯做了改變。 2.儲存在客戶端,相對服務端,安全性更低一些。當JWT生成的token被破解,我們不便於清除該token。

如何使用JWT

這裡推薦使用GitHub上面人家封裝好的包,這裡我使用的是firebase/php-jwt,在專案中直接使用即可安裝成功。

composer require firebase/php-jwt

接下來建立一個控制器,我這裡使用的ThinkPHP5.1的框架

use think\Controller;
use Firebase\JWT\JWT;

class Test extends Controller
{
    private $key = 'jwtKey';

    // 生成JWT
    public function createJwt()
    {
        $time  = time();
        $key   = $this->key;
        $token = [
            'iss' => 'https://www.qqdeveloper.com',// 簽發人
            'exp' => $time + 86400,// 過期時間(這裡的有效期時間為1天)
            'sub' => '主題內容',// 主題
            'aud' => '受眾內容',// 受眾
            'nbf' => $time,// 生效時間
            'iat' => $time,// 簽發時間
            'jti' => 123,// 編號
            // 額外自定義的資料
            'data' => [
                'userName' => '程式設計浪子走四方'
            ]];
        // 呼叫生成加密方法('Payloadn內容','加密的鍵',['加密演算法'],['加密的可以'],['JWT的header頭'])
        $jwt = JWT::encode($token, $key);
        return json(['data' => $jwt]);
    }

    // 解析JWT
    public function analysisJwt()
    {
        try {
            $key = $this->key;
            $jwt = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImV4cCI6MTU2ODA5NjE4MCwic3ViIjoiXHU0ZTNiXHU5ODk4XHU1MTg1XHU1YmI5IiwiYXVkIjoiXHU1M2Q3XHU0ZjE3XHU1MTg1XHU1YmI5IiwibmJmIjoxNTY4MDA5NzgwLCJpYXQiOjE1NjgwMDk3ODAsImp0aSI6MTIzLCJkYXRhIjp7InVzZXJOYW1lIjoiXHU3ZjE2XHU3YTBiXHU2ZDZhXHU1YjUwXHU4ZDcwXHU1NmRiXHU2NWI5In19.kHb_9Np0zjE25YE9czUEGvmFPYtqMJT9tuZzJTuMZl0';
            // 呼叫解密方法('JWT內容','解密的鍵,和加密時的加密鍵一直','加密演算法')
            $decoded = JWT::decode($jwt, $key, array('HS256'));
            return json(['message' => $decoded]);
        } catch (\Exception $exception) {
            return json(['message' => $exception->getMessage()]);
        }

    }
}

通過訪問第一個方法,可以生成下圖一段字串 我們將上圖中的字串複製到第二圖中的$jwt變數,訪問第二個方法即可解析出具體的資料。

相關推薦

JSON WEB TOKEN

定義:JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用JWT在使用者和伺服器之間傳遞安全可靠的資訊。 適用場景: 1、用於向Web應用傳遞一些非敏感資訊。例如完成加好友、下訂單的操作等等。 2、用於設計使用者認證和授權系統。

Json Web Token(JWT)

再次 即使 設備 系統 客戶 利用 fck 第三方服務 ont 什麽是Json Web Token Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別

JSON Web Token(JWT)的

1、傳統身份驗證和JWT的身份驗證 傳統身份驗證:       HTTP 是一種沒有狀態的協議,也就是它並不知道是誰是訪問應用。這裡我們把使用者看成是客戶端,客戶端使用使用者名稱還有密碼通過了身份驗證,不過下回這個客戶端再發送請求時候,還得再驗證一下。 解決的方法就是,

JSON Web Token 使用

JWT是什麼? JSON Web Token(縮寫 JWT)是目前最流行的<font color='red'>跨域

【Java Web】: JSON 資料格式

  JSON (JavaScript Object Notation) JavaScript物件圖,它是由Douglas Crockford(道格拉斯·克洛克福特)發明的。   JSON與XML一樣

使用json web token

undefined this dmi ber sub 數據庫 說明 nat publish 由來 做了這麽長時間的web開發,從JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到現在的nodej

Web Storage

參考 等等 窗口 tro 就會 moc 類型 瀏覽器 語言 1、概述: 對於Web Storage來說,實際上是Cookies存儲的進化版。如果了解Cookie的人幾乎一看Web Storage就會用,如果你從來沒用過沒了解過Cookie,沒關系,看了這篇文章照樣輕松玩轉W

[轉]八幅漫畫理解使用JSON Web Token設計單點登錄系統

漫畫 響應 嘗試 占用 tao 自己的 解碼 -a 發送 上次在《JSON Web Token - 在Web應用間安全地傳遞信息》中我提到了JSON Web Token可以用來設計單點登錄系統。我嘗試用八幅漫畫先讓大家理解如何設計正常的用戶認證系統,然後再延伸到單點登錄系統

利用Redis撤銷JSON Web Token產生的令牌

redis數據庫 pre 是否 pop 實例 撤銷 logo send .post 利用Redis撤銷JSON Web Token產生的令牌 作者:chszs。版權全部。未經允許,不得轉載。博主主頁:http://blog.csdn.net/chszs

轉:Eclipse中創建Maven版的Web工程()

搭建 9.png loaded script idt content 註意 simple facet 一、搭建步驟 ?首先創建一個Maven的Project,如下圖: ?點擊Next,勾選 Create a simple project ?點擊Next,註意Pack

什麽是JWT(JSON WEB TOKEN

加密 string style 直接 協議 策略 ade aud images 什麽是JWT Json web token(JWT)是為了網絡應用環境間傳遞聲明而執行的一種基於JSON的開發標準(RFC 7519),該token被設計為緊湊且安全的,特別適用於分

JWT--JSON WEB TOKEN

hmac 授權 消費者 隨著 相關 數據 cors 服務器端 容易 轉自簡書 http://www.jianshu.com/p/576dbf44b2ae 什麽是JWT Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標

SpringMVC接受JSON參數及常見錯誤總結我改

pen 接口 var token 練手 一個 lips users 是不是 SpringMVC接受JSON參數詳解及常見錯誤總結 最近一段時間不想使用Session了,想感受一下Token這樣比較安全,穩健的方式,順便寫一個統一的接口給瀏覽器還有APP。所以把一個練手項目

JWT(JSON WEB TOKEN) / oauth2 / SSL

bash 字符 維護 ssl 信息 簡單 角色 ron 保存會話 1: JWT:   為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用於分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來

JWT JSON Web Token

bubuko 可靠的 分組 使用 dig pan alt 可靠 stringify JWT(JSON Web Token) 允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息的規範。 JWT由三個部分組成:header(頭部)、payload(載荷)、signature

深入淺出JWT(JSON Web Token )

sha 安全 nature 調試器 orm 攔截 們的 登錄 長度限制 1. JWT 介紹 JSON Web Token(JWT)是一個開放式標準(RFC 7519),它定義了一種緊湊(Compact)且自包含(Self-contained)的方式,用於在各方之間以JSON

Json Web Token(JWT)

.json import form hid color 執行 加密方法 isa dep Json web token (JWT),是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準((RFC 7519)。該token被設計為緊湊且安全的,特別適用於分布式站點的

JSON Web Token的使用(轉載)

過期 多臺 hcm 完整 協議 客戶端 word https協議 rod 定義JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息。適用場景1、用於向Web應用傳遞一些非敏感信息。例如完成加好友、下訂單的

[認證授權] 2.OAuth2授權(續) & JWT(JSON Web Token)

har 表示 一個 wii body 是什麽 ibm 其他 user 1 RFC6749還有哪些可以完善的? 1.1 撤銷Token 在上篇[認證授權] 1.OAuth2授權 中介紹到了OAuth2可以幫我們解決第三方Client訪問受保護資源的問題,但是只提供了如何獲