JSON Web Token

JSON Web Token

1.什么是JWT?

JSON Web Token (JWT)是?個開放標(biāo)準(zhǔn)(RFC 7519),它定義了?種緊湊的、?包含的?式,?于
作為JSON對象在各?之間安全地傳輸信息。該信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。

1.1.什么時(shí)候應(yīng)該用JWT?

JSON Web Token (JWT)是?個開放標(biāo)準(zhǔn),它定義了?種緊湊的、?包含的?式,?于
作為JSON對象在各?之間安全地傳輸信息。該信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。

1.2.認(rèn)證流程

image-20210827165954270
image-20210827170034117
image-20210827170041709

1.3.JWT的優(yōu)勢在哪?

image-20210827170106840

1.4.JWT具體包含的信息

1.header

image-20210827170148205

2.Payload

image

3.Signature

image-20210827170243910

2.SpringBoot JWT 初始化

2.1整合POM

  <dependencies>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.0</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <!--plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>
        <!--jwt-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.18.1</version>
        </dependency>
        <!-- spring -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.2測試JWT加密流程

image-20210827170525494
image-20210827170537381

3.封裝工具類JWTUtils

image-20210827170611141

4.登錄接口邏輯

   @GetMapping("/user/login")
    public Map<String, Object> login(User user) {
        HashMap<String, Object> map = new HashMap<>();
        try {
            // find user in DB
            User userDB = userService.login(user);

            HashMap<String, String> payload = new HashMap<>();
            // add info into payload
            payload.put("id", String.valueOf(userDB.getId()));
            payload.put("name", userDB.getName());

            // 生成JWT的令牌
            String token = JWTUtils.getToken(payload);

            // return info to user login
            map.put("state", true);
            map.put("msg", "認(rèn)證成功");
            map.put("token", token);
        } catch (Exception e) {
            // can't find user
            map.put("state", false);
            map.put("msg", e.getMessage());
        }
        return map;
    }

5.驗(yàn)證Token邏輯(原始)

 @PostMapping("/user/test")
    public Map<String, Object> test(String token) {
        HashMap<String, Object> map = new HashMap<>();
        /*
        try {
            JWTUtils.verify(token);
            map.put("state", true);
            map.put("msg", "請求成功!");
            return map;

        } catch (SignatureVerificationException e) {
            // 過期異常
            e.printStackTrace();
            map.put("msg", "無效簽名!");
        } catch (TokenExpiredException e) {
            // token不一致異常
            e.printStackTrace();
            map.put("msg", "token過期!");
        } catch (AlgorithmMismatchException e) {
            // 算法不一致異常
            e.printStackTrace();
            map.put("msg", "算法不一致!");
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msg", "無效簽名!");
        }
             map.put("state", false);
        */
        // 處理自己的業(yè)務(wù)邏輯
        map.put("state", true);
        map.put("msg", "請求成功");
        return map;
    }

6.JWT過濾器簡化驗(yàn)證Token邏輯

image-20210827170642222

6.1創(chuàng)建JWT登錄過濾器

image-20210827170650576

6.2注冊JWT過濾器到Spring容器中

image-20210827170702967
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容