最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言如何使用golang-jwt/jwt/v4進(jìn)行JWT鑒權(quán)詳解

 更新時間:2022年09月19日 09:16:57   作者:楓花海  
最近項目中需要用到鑒權(quán)機(jī)制,golang中jwt可以用,這篇文章主要給大家介紹了關(guān)于Go語言如何使用golang-jwt/jwt/v4進(jìn)行JWT鑒權(quán)的相關(guān)資料,需要的朋友可以參考下

前言

最近寫的項目中用到了JWT鑒權(quán),因此做個記錄

原先的jwt-go倉庫已經(jīng)不再維護(hù),遷移到了github.com/golang-jwt/jwt/v4

但是網(wǎng)上大多數(shù)還是v3版本的使用教程,建議使用更加安全的v4

1.什么是JWT

JSON Web Token (JWT)是一個開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊的、自包含的方式,用于作為JSON對象在各方之間安全地傳輸信息。特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。

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

實際的JWT由三部分組成,如下圖

中間用點(.)分隔成三個部分。注意,JWT 內(nèi)部是沒有換行的,這里只是為了便于展示,將它寫成了幾行。JWT的三個部分依次如下:

  • Header(頭部)
  • Payload(負(fù)載)
  • Signature(簽名)

寫成一行就是Header.Payload.Signature

2.1 Header

Header 部分是一個 JSON 對象,描述 JWT 的元數(shù)據(jù),通常是下面的樣子

{
  "alg": "HS256",
  "typ": "JWT"
}

上面代碼中,alg屬性表示簽名的算法(algorithm),默認(rèn)是HMAC SHA256(寫成 HS256);typ屬性表示這個令牌(token)的類型(type),JWT 令牌統(tǒng)一寫為JWT。

將上面的 JSON 對象使用 Base64URL 算法(詳見后文)轉(zhuǎn)成字符串就成了第一部分Header。

2.2 Payload

Payload 部分也是一個 JSON 對象,用來存放實際需要傳遞的數(shù)據(jù)。JWT 規(guī)定了7個官方字段,供選用。

  • iss (issuer):簽發(fā)人
  • exp (expiration time):過期時間
  • sub (subject):主題
  • aud (audience):受眾
  • nbf (Not Before):生效時間
  • iat (Issued At):簽發(fā)時間
  • jti (JWT ID):編號

我們還可以在這個部分自己定義字段,下面就是一個例子

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

注意,JWT 默認(rèn)是不加密的,任何人都可以讀到,所以不要把秘密信息放在這個部分。

這個 JSON 對象也要使用 Base64URL 算法轉(zhuǎn)成字符串。

2.3 Signature

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

首先,需要指定一個密鑰(secret)。這個密鑰只有服務(wù)器才知道,不能泄露給用戶。然后,使用 Header 里面指定的簽名算法(默認(rèn)是 HMAC SHA256),按照下面的公式產(chǎn)生簽名。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

2.4 Base64URL

前面提到,HeaderPayload 串型化的算法是 Base64URL。這個算法跟 Base64 算法基本類似,但有一些小的不同。

JWT 作為一個令牌(token),有些場合可能會放到 URL(比如 api.example.com/?token=xxx)。Base64 有三個字符+,/和=,在 URL 里面有特殊含義,所以要被替換掉:=被省略、+替換成-,/替換成_ 。這就是 Base64URL 算法。

算出簽名以后,把 Header、Payload、Signature 三個部分拼成一個字符串,每個部分之間用"點"(.)分隔,就可以返回給用戶。

3使用JWT

安裝

go install "github.com/golang-jwt/jwt/v4"

生成Token

定義claimsserect

type MyClaims struct {
	Phone string `json:"phone"`
	jwt.RegisteredClaims  // 注意!這是jwt-go的v4版本新增的,原先是jwt.StandardClaims
}

var MySecret = []byte("手寫的從前") // 定義secret,后面會用到

生成token

// 這里傳入的是手機(jī)號,因為我項目登陸用的是手機(jī)號和密碼
func MakeToken(phone string) (tokenString string, err error) {
	claim := MyClaims{
		Phone: phone,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(3 * time.Hour * time.Duration(1))), // 過期時間3小時
			IssuedAt:  jwt.NewNumericDate(time.Now()),     // 簽發(fā)時間
			NotBefore: jwt.NewNumericDate(time.Now()),     // 生效時間
		}}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim) // 使用HS256算法
	tokenString, err = token.SignedString(MySecret)
	return tokenString, err
}

解析token

func Secret() jwt.Keyfunc {
	return func(token *jwt.Token) (interface{}, error) {
		return []byte("手寫的從前"), nil  // 這是我的secret
	}
}

func ParseToken(tokenss string) (*MyClaims, error) {
	token, err := jwt.ParseWithClaims(tokenss, &MyClaims{}, Secret())
	if err != nil {
		if ve, ok := err.(*jwt.ValidationError); ok {
			if ve.Errors&jwt.ValidationErrorMalformed != 0 {
				return nil, errors.New("that's not even a token")
			} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
				return nil, errors.New("token is expired")
			} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
				return nil, errors.New("token not active yet")
			} else {
				return nil, errors.New("couldn't handle this token")
			}
		}
	}
	if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
		return claims, nil
	}
	return nil, errors.New("couldn't handle this token")
}

參考:

JSON Web Token 入門教程

總結(jié)

到此這篇關(guān)于Go語言如何使用golang-jwt/jwt/v4進(jìn)行JWT鑒權(quán)的文章就介紹到這了,更多相關(guān)Go語言進(jìn)行JWT鑒權(quán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Golang實現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能

    基于Golang實現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能

    最近項目開發(fā)中有涉及到Excel的導(dǎo)入與導(dǎo)出功能,特別是導(dǎo)出表格時需要特定的格式,所以本文給大家介紹了基于Golang實現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能,文中通過代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • GO語言映射(Map)用法分析

    GO語言映射(Map)用法分析

    這篇文章主要介紹了GO語言映射(Map)用法,以實例形式較為詳細(xì)的分析了針對映射的創(chuàng)建、填充、遍歷及修改等操作的技巧,需要的朋友可以參考下
    2014-12-12
  • 詳解Go內(nèi)存模型

    詳解Go內(nèi)存模型

    這篇文章主要介紹了Go 內(nèi)存模型的相關(guān)資料,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Go 自定義error錯誤的處理方法

    Go 自定義error錯誤的處理方法

    這篇文章主要介紹了Go 自定義error錯誤的處理方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • gin?session中間件使用及源碼流程分析

    gin?session中間件使用及源碼流程分析

    這篇文章主要為大家介紹了gin?session中間件使用及源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go語言實現(xiàn)并發(fā)控制的常見方式詳解

    Go語言實現(xiàn)并發(fā)控制的常見方式詳解

    這篇文章主要為大家詳細(xì)介紹了Go語言實現(xiàn)并發(fā)控制的幾種常見方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-03-03
  • Golang爬蟲及正則表達(dá)式的實現(xiàn)示例

    Golang爬蟲及正則表達(dá)式的實現(xiàn)示例

    本文主要介紹了Golang爬蟲及正則表達(dá)式的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 詳解Go使用Viper和YAML管理配置文件

    詳解Go使用Viper和YAML管理配置文件

    在軟件開發(fā)中,配置管理是一項基本但至關(guān)重要的任務(wù),它涉及到如何有效地管理應(yīng)用程序的配置變量,本文將探討如何使用Viper庫配合YAML配置文件來實現(xiàn)高效的配置管理,感興趣的可以了解下
    2024-04-04
  • Go調(diào)度器學(xué)習(xí)之系統(tǒng)調(diào)用詳解

    Go調(diào)度器學(xué)習(xí)之系統(tǒng)調(diào)用詳解

    這篇文章腫,將以一個簡單的文件打開的系統(tǒng)調(diào)用,來分析一下Go調(diào)度器在系統(tǒng)調(diào)用時做了什么。文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-04-04
  • golang1.21新特性全面講解

    golang1.21新特性全面講解

    經(jīng)過了半年左右的開發(fā),golang?1.21?最近正式發(fā)布了,這個版本中有不少重要的新特性和變更,尤其是在泛型相關(guān)的代碼上,下面小編就來和大家好好嘮嘮吧
    2023-08-08

最新評論

勐海县| 宁乡县| 长乐市| 永吉县| 武隆县| 双城市| 青龙| 南通市| 洪江市| 石首市| 通山县| 十堰市| 军事| 任丘市| 梅州市| 甘泉县| 新巴尔虎左旗| 郎溪县| 铜梁县| 乌审旗| 双流县| 富锦市| 徐闻县| 那坡县| 长兴县| 南和县| 习水县| 比如县| 南通市| 临潭县| 恩施市| 临漳县| 南靖县| 邵东县| 宁明县| 南郑县| 肇州县| 海宁市| 平阴县| 崇义县| 蕲春县|