答案:使用golang-jwt/jwt库实现JWT认证,通过定义密钥和Claims结构,生成带过期时间的Token,登录接口返回Token,中间件解析验证Token并存入上下文,保护路由安全。需注意密钥安全、Token过期与失效管理。

在Go语言中实现JWT(JSON Web Token)认证机制,主要是通过生成、解析和验证Token来完成用户身份的无状态认证。下面介绍如何使用流行的 golang-jwt/jwt 库来实现完整的JWT登录认证流程。
go get github.com/golang-jwt/jwt/v5
var jwtKey = []byte("your-secret-key") // 建议从环境变量读取
<p>type Claims struct {
UserID uint <code>json:"user_id"</code>
Email string <code>json:"email"</code>
jwt.RegisteredClaims
}
func GenerateToken(userID uint, email string) (string, error) {
expirationTime := time.Now().Add(24 * time.Hour)
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">claims := &Claims{
UserID: userID,
Email: email,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(expirationTime),
IssuedAt: jwt.NewNumericDate(time.Now()),
NotBefore: jwt.NewNumericDate(time.Now()),
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString(jwtKey)}
func ValidateToken(tokenStr string) (*Claims, error) {
token, err := jwt.ParseWithClaims(tokenStr, &Claims{}, func(token *jwt.Token) (interface{}, error) {
return jwtKey, nil
})
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">if err != nil {
return nil, err
}
if claims, ok := token.Claims.(*Claims); token.Valid {
return claims, nil
} else {
return nil, errors.New("invalid token")
}}
func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
tokenHeader := r.Header.Get("Authorization")
if tokenHeader == "" {
http.Error(w, "Missing token", http.StatusUnauthorized)
return
}
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;"> tokenStr := strings.TrimPrefix(tokenHeader, "Bearer ")
claims, err := ValidateToken(tokenStr)
if err != nil {
http.Error(w, "Invalid or expired token", http.StatusUnauthorized)
return
}
// 可将用户信息存入上下文
ctx := context.WithValue(r.Context(), "user", claims)
next.ServeHTTP(w, r.WithContext(ctx))
})}
http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
// 此处应有用户名密码验证逻辑
token, err := GenerateToken(1, "user@example.com")
if err != nil {
http.Error(w, "Failed to generate token", http.StatusInternalServerError)
return
}
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{"token": token})})
受保护的路由使用中间件:
http.Handle("/protected", AuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user := r.Context().Value("user").(*Claims)
fmt.Fprintf(w, "Hello %s", user.Email)
})))
基本上就这些。关键点在于安全存储密钥、合理设置过期时间、防止Token泄露,并在每次请求中正确验证。JWT适合分布式系统,但一旦签发无法主动失效,如需控制权限变化,可结合黑名单或短期Token+刷新机制。
立即学习“go语言免费学习笔记(深入)”;
以上就是Golang如何实现JWT认证机制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号