📅  最后修改于: 2023-12-03 15:31:01.004000             🧑  作者: Mango
JWT (JSON Web Token) 是一种轻量级的认证机制,常用于在不同应用之间传递用户身份信息。在 Golang 中,可以使用 github.com/dgrijalva/jwt-go
库来处理 JWT。
使用以下命令可以安装 jwt-go
:
go get github.com/dgrijalva/jwt-go
现在,我们来看一个使用 JWT 认证机制的示例。
下面是一个用于创建 JWT Token 的函数:
import (
"github.com/dgrijalva/jwt-go"
"time"
)
func CreateToken(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("secretKey"))
if err != nil {
return "", err
}
return tokenString, nil
}
首先,我们使用 jwt.NewWithClaims
创建一个新的 Token。
这里指定使用 HS256 对 Token 进行签名,使用 jwt.MapClaims
映射需要存储在 Token 中的数据。
然后,我们设置 Token 中的 username 字段以及过期时间 exp,这里的过期时间设置为当前时间加上 24 小时。
最后,我们通过 SignedString
方法对 Token 进行签名生成最终的 Token 字符串。
下面是一个用于解析 JWT Token 的函数:
import (
"github.com/dgrijalva/jwt-go"
"time"
)
func ParseToken(tokenString string) (string, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("invalid signing method")
}
return []byte("secretKey"), nil
})
if err != nil {
return "", err
}
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
if int64(claims["exp"].(float64)) < time.Now().Unix() {
return "", fmt.Errorf("token is expired")
}
return claims["username"].(string), nil
} else {
return "", fmt.Errorf("invalid token")
}
}
首先,我们使用 jwt.Parse
方法解析传入的 Token 字符串。
然后,我们定义了一个回调函数用于指定解密 Token 使用的密钥,这里对应的密钥为 "secretKey"。
如果 Token 解析成功,我们检查 Token 是否过期,如果过期则返回相应的错误信息。
如果没有过期,则从解析出的 Token 中提取出我们需要的 username 字段值并返回。
以下是一个使用 JWT Token 进行身份认证的 HTTP 请求示例:
import (
"fmt"
"net/http"
)
func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
tokenString := r.Header.Get("Authorization")
if tokenString == "" {
http.Error(w, "token is missing", http.StatusUnauthorized)
return
}
username, err := ParseToken(tokenString)
if err != nil {
http.Error(w, err.Error(), http.StatusUnauthorized)
return
}
// 在此处可以进行权限校验等逻辑处理
next.ServeHTTP(w, r)
})
}
func ProtectedHandler(w http.ResponseWriter, r *http.Request) {
username := r.Context().Value("username").(string)
fmt.Fprintf(w, "Hello %s!", username)
}
func main() {
http.Handle("/protected", AuthMiddleware(http.HandlerFunc(ProtectedHandler)))
if err := http.ListenAndServe(":8080", nil); err != nil {
panic(err)
}
}
首先,我们定义了一个 AuthMiddleware
中间件,在 HTTP 请求中使用此中间件可以检查是否携带合法的 JWT Token。如果没有携带 Token 则返回相应的错误信息。
如果 Token 检查通过,则将解析出的 username 添加到请求上下文中并将请求交由后续处理器处理。
ProtectedHandler
是一个受保护的接口,只有在通过了 JWT 认证机制后才能访问。在此处可以进行权限校验等逻辑处理。
最后,我们使用 http.Handle
方法将接口与相应的中间件进行绑定并开启 HTTP 服务。
本示例介绍了如何在 Golang 中使用 JWT 认证机制,以及如何将 JWT Token 应用于 HTTP 请求中进行身份认证。通过阅读本文,您应该对 JWT 在 Golang 开发中的应用有了更深入的了解。