国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - SpringBoot集成Auth0 JWT的示例代碼

SpringBoot集成Auth0 JWT的示例代碼

2021-11-25 14:16夢(mèng)想是咸魚(yú) Java教程

本文主要介紹了SpringBoot集成Auth0 JWT的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

說(shuō)說(shuō)JWT,先說(shuō)下互聯(lián)網(wǎng)服務(wù)常見(jiàn)的兩種用戶(hù)認(rèn)證方式:

session認(rèn)證與Token認(rèn)證

session認(rèn)證

傳統(tǒng)的Session認(rèn)證的大體流程可以表示為用戶(hù)提供用戶(hù)名和密碼登錄后由服務(wù)器存儲(chǔ)一份用戶(hù)登錄信息并傳遞給瀏覽器保存為Cookie,并在下次請(qǐng)求中根據(jù)Cookie來(lái)識(shí)別用戶(hù),但這種方式缺陷明顯:

  • Session都是保存在內(nèi)存中,隨著認(rèn)證用戶(hù)的增多,服務(wù)端的開(kāi)銷(xiāo)明顯增大
  • 保存在內(nèi)存中的Session限制了分布式的應(yīng)用
  • Cookie容易被截獲偽造

Token認(rèn)證

Token 泛指身份驗(yàn)證時(shí)使用的令牌,Token鑒權(quán)機(jī)制從某些角度而言與Cookie是一個(gè)作用,其目的是讓后臺(tái)知道請(qǐng)求是來(lái)自于受信的客戶(hù)端,其通過(guò)實(shí)現(xiàn)了某種算法加密的Token字符串來(lái)完成鑒權(quán)工作,其優(yōu)點(diǎn)在于:

  • 服務(wù)器不需要保存 Session 數(shù)據(jù)(無(wú)狀態(tài)),容易實(shí)現(xiàn)擴(kuò)展
  • 有效避免Cookie被截獲引發(fā)的CSRF攻擊
  • 可以存儲(chǔ)一些業(yè)務(wù)邏輯所必要的非敏感信息
  • 便于傳輸,其構(gòu)成非常簡(jiǎn)單,字節(jié)占用小

JWT簡(jiǎn)介

JWT定義

JWT全稱(chēng)為Json web token,也就是 Json 格式的 web token,可以這么理解:

Token // 個(gè)人證件
JWT // 個(gè)人身份證

JWT數(shù)據(jù)結(jié)構(gòu)

JWT由三段字符串組成,中間用.分隔,如下:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInNjb3BlIjo4LCJleHAiOjE3MTU3NDAyMjIsImlhdCI6MTYyOTM0MDIyMn0.wuRsF5wvLHbDF_21Pocas8SeXQ315rgBl6wm1LRL2bQ

JWT 的三個(gè)部分依次如下:

  • Header(頭部)// Header 部分是一個(gè) JSON 對(duì)象,描述 JWT 的元數(shù)據(jù),通常是下面的樣子。
  • Payload(負(fù)載)// Payload 部分是一個(gè) JSON 對(duì)象,用來(lái)存放實(shí)際需要傳遞的數(shù)據(jù)
  • Signature(簽名)// Signature 部分是對(duì)前兩部分的簽名,防止數(shù)據(jù)篡改

第一段字符串Header:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9將其 Base64 解碼后得到:

?
1
2
3
4
{
    "typ": "JWT", // TOKEN TYPE ,token類(lèi)型
    "alg": "HS256"  //ALGORITHM,算法 哈希256
}

第二段字符串Payload:eyJ1aWQiOjEsInNjb3BlIjo4LCJleHAiOjE3MTU3NDAyMjIsImlhdCI6MTYyOTM0MDIyMn0

PAYLOAD是數(shù)據(jù)載體,可以有自定義數(shù)據(jù)

?
1
2
3
{
"uid": "1234567890" // 自定義數(shù)據(jù)
}

第三段字符串Signature:wuRsF5wvLHbDF_21Pocas8SeXQ315rgBl6wm1LRL2bQ

Signature 部分是對(duì)前兩部分的簽名,防止數(shù)據(jù)篡改。

JWT的類(lèi)庫(kù)

Java 中的 JWT 有很多類(lèi)庫(kù),關(guān)于其優(yōu)缺點(diǎn)可以在官網(wǎng)查看:https://jwt.io/,這里我們介紹Auth0的JWT的集成使用方式

Auth0 實(shí)現(xiàn)的 com.auth0 / java-jwt / 3.3.0
Brian Campbell 實(shí)現(xiàn)的 org.bitbucket.b_c / jose4j / 0.6.3
connect2id 實(shí)現(xiàn)的 com.nimbusds / nimbus-jose-jwt / 5.7
Les Hazlewood 實(shí)現(xiàn)的 io.jsonwebtoken / jjwt / 0.9.0
FusionAuth 實(shí)現(xiàn)的 io.fusionauth / fusionauth-jwt / 3.1.0
Vert.x 實(shí)現(xiàn)的 io.vertx / vertx-auth-jwt / 3.5.1

具體實(shí)現(xiàn)

JWT配置

pom.xml

?
1
2
3
4
5
6
<!-- jwt -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.8.1</version>
</dependency>

application.yml

?
1
2
3
4
5
coisini:
  security:
    jwt-key: coisini
    # 過(guò)期時(shí)間
    token-expired-in: 86400000

JWT工具類(lèi)

JwtUtil.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.*;
 
/**
 * @Description JWT工具類(lèi)
 * @author coisini
 * @date Aug 18, 2021
 * @Version 1.0
 */
@Component
public class JwtUtil {
 
    /**
     * key
     */
    private static String jwtKey;
 
    /**
     * 過(guò)期時(shí)間
     */
    private static Integer expiredTimeIn;
 
    /**
     * JWT KEY
     * @param jwtKey
     */
    @Value("${coisini.security.jwt-key}")
    public void setJwtKey(String jwtKey) {
        JwtUtil.jwtKey = jwtKey;
    }
 
    /**
     * 過(guò)期時(shí)間
     * @param expiredTimeIn
     */
    @Value("${coisini.security.token-expired-in}")
    public void setExpiredTimeIn(Integer expiredTimeIn) {
        JwtUtil.expiredTimeIn = expiredTimeIn;
    }
 
    /**
     * 生成令牌
     * @param uid 用戶(hù)id
     * @return
     */
    public static String makeToken(Long uid) {
        return JwtUtil.getToken(uid);
    }
 
    /**
     * 獲取令牌
     * @param uid 用戶(hù)id
     * @param scope 權(quán)限分級(jí)數(shù)字
     * @return
     */
    private static String getToken(Long uid) {
        // 指定算法
        Algorithm algorithm = Algorithm.HMAC256(JwtUtil.jwtKey);
 
        Map<String, Date> dateMap = JwtUtil.calculateExpiredIssues();
 
        /**
         * withClaim() 寫(xiě)入自定義數(shù)據(jù)
         * withExpiresAt() 設(shè)置過(guò)期時(shí)間
         * withIssuedAt() 設(shè)置當(dāng)前時(shí)間
         * sign() 簽名算法
         */
        return JWT.create()
                    .withClaim("uid", uid)
                    .withExpiresAt(dateMap.get("expiredTime"))
                    .withIssuedAt(dateMap.get("now"))
                    .sign(algorithm);
    }
 
    /**
     * 獲取自定義數(shù)據(jù)
     * @param token
     * @return
     */
    public static Optional<Map<String, Claim>> getClaims(String token) {
        DecodedJWT decodedJWT;
 
        // 指定算法
        Algorithm algorithm = Algorithm.HMAC256(JwtUtil.jwtKey);
        JWTVerifier jwtVerifier = JWT.require(algorithm).build();
 
        try {
            decodedJWT = jwtVerifier.verify(token);
        } catch (JWTVerificationException e) {
            return Optional.empty();
        }
 
        return Optional.of(decodedJWT.getClaims());
    }
 
    /**
     * 驗(yàn)證Token
     * @param token
     * @return
     */
    public static boolean verifyToken(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(JwtUtil.jwtKey);
            JWTVerifier jwtVerifier = JWT.require(algorithm).build();
            jwtVerifier.verify(token);
        } catch (JWTVerificationException e) {
            return false;
        }
 
        return true;
    }
 
    /**
     * 計(jì)算過(guò)期時(shí)間
     * @return
     */
    private static Map<String, Date> calculateExpiredIssues() {
        Map<String, Date> map = new HashMap<>();
        Calendar calendar = Calendar.getInstance();
        Date now = calendar.getTime();
        calendar.add(Calendar.SECOND, JwtUtil.expiredTimeIn);
        // 當(dāng)前時(shí)間
        map.put("now", now);
        // 過(guò)期時(shí)間
        map.put("expiredTime", calendar.getTime());
        return map;
    }
}

測(cè)試接口

JwtController.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@RestController
@RequestMapping("/jwt")
public class JwtController {
 
    /**
     * 獲取Token
     * @param id
     * @return
     */
    @GetMapping(value = "/get")
    public String getToken(@RequestParam Long id) {
        return JwtUtil.makeToken(id);
    }
 
    /**
     * 驗(yàn)證Token
     * @param token
     * @return
     */
    @PostMapping("/verify")
    public Map<String, Boolean> verify(@RequestParam String token) {
        Map<String, Boolean> map = new HashMap<>();
        Boolean valid = JwtUtil.verifyToken(token);
        map.put("is_valid", valid);
        return map;
    }
 
}

測(cè)試結(jié)果

SpringBoot集成Auth0 JWT的示例代碼

SpringBoot集成Auth0 JWT的示例代碼

JWT生成的Token應(yīng)該放在請(qǐng)求頭內(nèi)來(lái)傳輸,后端統(tǒng)一攔截驗(yàn)證,這里留在下篇文章吧。。。

到此這篇關(guān)于SpringBoot集成Auth0 JWT的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot集成Auth0 JWT內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/maggieq8324/p/15161692.html

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開(kāi)發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線(xiàn)程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒(méi)有升過(guò)級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲一区二区免费视频 | 国产精品日本 | 在线观看中文字幕 | 中文字幕视频在线 | 中文字幕在线一区 | 国产黄色小视频 | 久久久一级 | 两性视频久久 | 午夜视频在线免费观看 | 黄色av一级片 | 午夜免费福利视频 | 在线观看欧美 | 精品视频一区二区三区四区 | 成人午夜精品一区二区三区 | 最新国产一区二区 | 天天天干天天天操 | 国产精品99久久久久久动医院 | 久久影院免费观看 | 99久久婷婷国产精品综合 | 日本高清无卡码一区二区久久 | 91精品一区二区三区久久久久久 | 亚洲四区| 日韩不卡一区二区三区 | 精品久| 综合自拍 | 久久久99精品免费观看 | 一区二区三区在线播放 | 欧美综合在线观看 | 欧美一区二区三区精品免费 | 在线视频一区二区三区 | 亚洲自拍偷拍在线 | 精品无码久久久久国产 | 伦理午夜电影免费观看 | 亚洲生活片| 欧美久久成人 | 精品亚洲综合 | 一级α片免费看 | 国产一区二区三区久久 | av一区二区三区免费观看 | 国产视频一二三区 | 精品国产乱码久久久久久1区2区 |