JSON Web Token(JWT)是一種用於身份驗證和授權的開放標準。它以緊湊且安全的方式傳遞信息,它是基於JSON格式和一種自包含的方式來安全傳輸信息的輕量級的方式。
使用GoJWT可以很方便的實現身份驗證和授權,下面就從以下幾個方面進行詳細的闡述。
一、使用GoJWT生成Token
在Go語言中,我們可以使用第三方庫github.com/dgrijalva/jwt-go來完成JWT的生成。下面是一段示例代碼:
import (
"github.com/dgrijalva/jwt-go"
"time"
)
func GenerateToken(username string) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"username": username,
"exp": time.Now().Add(time.Hour * 24).Unix(),
})
tokenString, err := token.SignedString([]byte("jwt-secret-key"))
if err != nil {
return "", err
}
return tokenString, nil
}
在以上示例代碼中,`jwt.NewWithClaims()`會返回一個生成的Token對象,而`jwt.MapClaims`是該Token中的一些聲明。其中,`exp`欄位表示超時時間,在這裡設置為1天過期。
二、使用GoJWT進行Token認證
GoJWT也支持Token的認證,以下是一段示例代碼:
import (
"github.com/dgrijalva/jwt-go"
"net/http"
"strings"
)
func Authenticate(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
header := r.Header.Get("Authorization")
if header == "" {
w.WriteHeader(http.StatusUnauthorized)
return
}
headerParts := strings.Split(header, " ")
if len(headerParts) != 2 || headerParts[0] != "Bearer" {
w.WriteHeader(http.StatusUnauthorized)
return
}
tokenString := headerParts[1]
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte("jwt-secret-key"), nil
})
if err != nil || !token.Valid {
w.WriteHeader(http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}
以上代碼先進行了Token的解析操作,使用`jwt.Parse()`函數可以解析出Token中存儲的聲明。然後使用`jwt.Valid()`函數驗證Token的有效性,如果驗證通過,就讓`next.ServeHTTP()`函數處理請求,否則返回「401 Unauthorized」響應。
三、使用GoJWT實現許可權控制
GoJWT還可以實現簡單的許可權控制,以下是一個示例代碼:
import (
"github.com/dgrijalva/jwt-go"
"net/http"
"strings"
)
func Authorize(roles ...string) func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
header := r.Header.Get("Authorization")
if header == "" {
w.WriteHeader(http.StatusUnauthorized)
return
}
headerParts := strings.Split(header, " ")
if len(headerParts) != 2 || headerParts[0] != "Bearer" {
w.WriteHeader(http.StatusUnauthorized)
return
}
tokenString := headerParts[1]
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte("jwt-secret-key"), nil
})
if err != nil || !token.Valid {
w.WriteHeader(http.StatusUnauthorized)
return
}
claims, ok := token.Claims.(jwt.MapClaims)
if !ok {
w.WriteHeader(http.StatusUnauthorized)
return
}
claimRoles, ok := claims["roles"].([]interface{})
if !ok {
w.WriteHeader(http.StatusUnauthorized)
return
}
for _, role := range roles {
for _, claimRole := range claimRoles {
if claimRole == role {
next.ServeHTTP(w, r)
return
}
}
}
w.WriteHeader(http.StatusForbidden)
})
}
}
以上代碼實現了一個`Authorize()`函數,該函數接收一個或多個角色名稱作為參數,然後返回一個HTTP處理器`func(next http.Handler) http.Handler`。該HTTP處理器首先從請求頭中獲取Token,然後解析Token,如果解析和驗證成功,就提取Token中存儲的角色信息。最後,該處理器會根據傳遞的角色參數檢查Token中是否包含授權的角色。
四、總結
使用GoJWT可以快速而方便地完成身份驗證和授權相關的開發工作。在使用GoJWT過程中,需要注意保證Token的安全性,以免泄露敏感信息。同時,需要進行合理的許可權控制,保證系統的穩定性和安全性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159211.html
微信掃一掃
支付寶掃一掃