新聞中心
JWT簡(jiǎn)介
JSON Web Token(JWT)是一種開(kāi)放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊且自包含的方式,用于在各方之間安全地傳輸信息作為JSON對(duì)象,這種信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的,JWT可以確保消息的完整性和身份驗(yàn)證,因此它們被廣泛用于身份驗(yàn)證和授權(quán)場(chǎng)景。

創(chuàng)新互聯(lián)主要從事網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)公司、程序開(kāi)發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信小程序開(kāi)發(fā)等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷、管理等多方位專業(yè)化運(yùn)作于一體。
Golang使用JWT進(jìn)行身份驗(yàn)證的最佳實(shí)踐
1、安裝依賴庫(kù)
在開(kāi)始使用JWT之前,我們需要安裝一些依賴庫(kù),在Golang中,我們可以使用github.com/dgrijalva/jwt-go庫(kù)來(lái)處理JWT相關(guān)操作,通過(guò)以下命令安裝依賴庫(kù):
go get -u github.com/dgrijalva/jwt-go
2、生成Token
要生成一個(gè)JWT Token,我們需要?jiǎng)?chuàng)建一個(gè)jwt.Token實(shí)例,并設(shè)置一些相關(guān)的聲明(claims),以下是一個(gè)簡(jiǎn)單的示例:
package main
import (
"fmt"
"time"
"github.com/dgrijalva/jwt-go"
)
func main() {
// 創(chuàng)建一個(gè)簽名密鑰
key := []byte("my_secret_key")
// 創(chuàng)建一個(gè)新的token實(shí)例
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"exp": time.Now().Add(time.Hour * 72).Unix(), // 設(shè)置過(guò)期時(shí)間為1小時(shí)后
"nbf": time.Now().Unix(), // 設(shè)置生效時(shí)間為現(xiàn)在
"sub": "123456", // 設(shè)置用戶ID為123456
})
// 使用簽名密鑰對(duì)token進(jìn)行簽名
tokenString, err := token.SignedString(key)
if err != nil {
fmt.Println("Error signing token:", err)
return
}
fmt.Println("Generated Token:", tokenString)
}
3、解析Token
要解析一個(gè)JWT Token,我們需要使用jwt.ParseWithClaims函數(shù),這個(gè)函數(shù)會(huì)返回一個(gè)*jwt.Token實(shí)例和一個(gè)錯(cuò)誤,如果解析成功,我們可以通過(guò)訪問(wèn)Claims()方法來(lái)獲取聲明(claims),以下是一個(gè)簡(jiǎn)單的示例:
package main
import (
"fmt"
"time"
"github.com/dgrijalva/jwt-go"
)
func main() {
// 創(chuàng)建一個(gè)簽名密鑰
key := []byte("my_secret_key")
tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ" // 從上文生成的Token字符串替換這里
claims := &jwt.StandardClaims{} // 創(chuàng)建一個(gè)空的聲明實(shí)例
_, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) { // 使用簽名密鑰驗(yàn)證token的簽名
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { // 如果簽名方法不是HMAC,則返回錯(cuò)誤和nil值
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
} else if _, ok := token.SigningKey.(*jwt.HMAC); !ok || len(token.SigningKey) != len(key) { // 如果簽名密鑰不是HMAC或者長(zhǎng)度不等于我們?cè)O(shè)置的密鑰長(zhǎng)度,則返回錯(cuò)誤和nil值
return nil, fmt.Errorf("invalid signing key: %v", token.SigningKey)
} else if claims, ok := token.Claims.(*jwt.StandardClaims); ok && token.Valid { // 如果聲明類型正確且token有效,則返回nil值和聲明實(shí)例本身
return claims, nil
} else if claims, ok := token.Claims.(*jwt.RefreshableClaims); ok && token.Valid { // 如果聲明類型正確且token有效且是RefreshableClaims類型,則返回nil值和聲明實(shí)例本身以及刷新令牌(如果有的話)
return claims, nil, token.RefreshToken
} else if claims, ok := token.Claims.(*jwt.UnverifiableClaims); ok && token.Valid && len(token.Raw) > 0 && token != nil && tokenString == token.Raw { // 如果聲明類型正確且token有效且是非可驗(yàn)證的聲明類型、原始token字符串與生成的token字符串相同且token不為nil,則返回nil值、聲明實(shí)例本身以及原始token字符串(作為刷新令牌)
return claims, nil, tokenString + "+" + claims.ExpiresAt.Sub(time.Now()).String() + "+" + claims.Issuer + "+" + claims.Subject + "+" + claims.Audience[0] + "+" + claims.Jti + "+" + claims.NotBefore + "+" + claims.Nbf + "+" + claims.Expiration + "+" + claims.IssuedAt + "+" + claims.Id + "+" + claims.Username + "+" + claims.Email + "+" + claims.Role + "+" + claims.Gender + "+" + claims["custom_field"] // 將其他自定義字段添加到這里,用"+"連接各個(gè)字段值和分隔符字符串拼接成完整的刷新令牌字符串
} else if isExpiredToken(token) && token != nil && tokenString == token.Raw && len(tokenString) > len("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") && len(tokenString) < len("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ") && len(claimsBytes, err) > len("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") && len(claimsBytes, err) < len("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ") && len(claimsBytes, err) > len("eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9") && len(claimsBytes, err) < len("eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Imh0dHBzOlw6YWRtaW4ucGFzc3dvcmQvc2VudDpteS1hc3NldHMtc2VyaWFsaXplZGtleSI6ICItaWQgdGV4dC1hcmtldCBmcm9tIFZhbHVlLCBXb3JsZCEnKTogVGV4dC1hdGVkIGFuZCBkaXN0IGlkLGNvbmNhdCgxKzEpICgyNCBleGFtcGxlLnRlc3QpbiBiYXNlNjQgc3RyaW5nIGNvbnRlbnRzIE1hbnVzaCwgSW1hZ2VDLWRmaWxlcyBXb3JsZCkgVmlldzENCiAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwaXRvcmlmeSBleGFtcGxlLnRlc3QpbiBiYXNlNjQgc3RyaW5nIGNvbnRlbnRzIE1hbnVzaCggaGVyb3
名稱欄目:golang登錄驗(yàn)證
URL分享:http://www.dlmjj.cn/article/djcdspp.html


咨詢
建站咨詢
