XuLaLa.Tech

首页客户端下载Windows 使用V2Ray 教程SSR 教程Clash 教程

Golang 如何实现 JWT?

2025.04.09

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以 JSON 对象安全地传输信息。该信息通过数字签名进行验证和信任。JWT 通常用于身份验证和信息交换,在 Web 开发中被广泛使用,Golang是当前比较流行的一种开发语言,所以在Golang中实现JWT是一个常见的业务场景。

文章目录

  • 1 在 Golang 中实现 JWT
    • 1.1 安装 jwt-go 库
    • 1.2 生成 JWT
    • 1.3 验证 JWT
  • 2 业务实现
    • 2.1 登录生成 JWT 示例
    • 2.2 请求验证 JWT 示例

在 Golang 中实现 JWT

在 Golang 中实现 JWT,我们可以使用社区广泛使用的库 github.com/dgrijalva/jwt-go。该库提供了生成和验证 JWT 的简单方法。

安装 jwt-go 库

首先,我们需要安装 jwt-go 库:

go get github.com/dgrijalva/jwt-go

生成 JWT

下面是一个生成 JWT 的简单示例:

package main
import (
"fmt"
"time"
"github.com/dgrijalva/jwt-go"
)
func main() {
// 创建一个新的 token 对象,指定签名方法和 claims
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"name": "John Doe",
"admin": true,
"exp":  time.Now().Add(time.Hour * 72).Unix(),
})
// 使用密钥字符串对 token 对象进行签名,并获得完整的编码后的 token 字符串
tokenString, err := token.SignedString([]byte("your-256-bit-secret"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Generated Token: ", tokenString)
}

验证 JWT

验证 JWT 也非常简单:

package main
import (
"fmt"
"github.com/dgrijalva/jwt-go"
)
func main() {
tokenString := "your.jwt.token"
// 解析 token
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
// 确保 token 使用的是我们期望的签名方法
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
// 返回用于签名的密钥
return []byte("your-256-bit-secret"), nil
})
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
fmt.Println("Name: ", claims["name"])
fmt.Println("Admin: ", claims["admin"])
} else {
fmt.Println(err)
}
}

业务实现

在实际应用中,我们通常在用户登录时生成 JWT,并将其返回给客户端。客户端在后续请求中将 JWT 放在 Authorization 头部发送给服务器。服务器接收到请求后,验证 JWT 的有效性,并根据 JWT 中的声明信息进行权限控制。

登录生成 JWT 示例

package main
import (
"net/http"
"time"
"github.com/dgrijalva/jwt-go"
"encoding/json"
)
var mySigningKey = []byte("your-256-bit-secret")
func loginHandler(w http.ResponseWriter, r *http.Request) {
// 假设用户名和密码验证成功
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"name": "John Doe",
"admin": true,
"exp":  time.Now().Add(time.Hour * 72).Unix(),
})
tokenString, err := token.SignedString(mySigningKey)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
json.NewEncoder(w).Encode(map[string]string{"token": tokenString})
}
func main() {
http.HandleFunc("/login", loginHandler)
http.ListenAndServe(":8080", nil)
}

请求验证 JWT 示例

package main
import (
"net/http"
"fmt"
"github.com/dgrijalva/jwt-go"
)
var mySigningKey = []byte("your-256-bit-secret")
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, "Authorization header missing", http.StatusUnauthorized)
return
}
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return mySigningKey, nil
})
if err != nil || !token.Valid {
http.Error(w, "Invalid token", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}
func protectedHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "This is a protected endpoint")
}
func main() {
http.Handle("/protected", authMiddleware(http.HandlerFunc(protectedHandler)))
http.ListenAndServe(":8080", nil)
}

在实际应用中,JWT 可以用于身份验证和信息交换,确保传输数据的安全性和完整性。

© 2010-2022 XuLaLa 保留所有权利 本站由 WordPress 强力驱动
请求次数:69 次,加载用时:0.665 秒,内存占用:32.19 MB