在 go-zero
框架中,使用 jwt-go
是为了实现基于 JSON Web Token (JWT) 的身份验证和授权。go-zero
是一个轻量级的 Go 微服务框架,它内置了对 JWT 的支持,以便简化开发过程。
使用 jwt-go 在 go-zero 中实现 JWT
- 安装依赖:
你需要确保你的项目中包含
jwt-go
库,可以通过以下命令安装:
go get github.com/dgrijalva/jwt-go
- 生成 JWT: 你可以创建一个函数来生成 JWT。在生成过程中,你需要指定密钥和声明(如用户ID、过期时间等)。
package main
import (
"github.com/dgrijalva/jwt-go"
"time"
)
func GenerateJWT(secret string, userId int64) (string, error) {
claims := jwt.MapClaims{
"user_id": userId,
"exp": time.Now().Add(time.Hour * 72).Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString([]byte(secret))
}
- 解析 JWT: 在处理请求时,你可以解析和验证传入的 JWT。
func ParseJWT(tokenStr string, secret string) (*jwt.Token, error) {
return jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, ErrInvalidToken
}
return []byte(secret), nil
})
}
集成到 go-zero: 在你的 API 路由中,可以通过中间件来保护某些路由,确保只有持有有效 JWT 的请求才能访问。
import (
"github.com/zeromicro/go-zero/rest/httpx"
// ... other imports
)
func AuthMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
tokenStr := r.Header.Get("Authorization")
if tokenStr == "" {
http.Error(w, "Authorization header is required", http.StatusUnauthorized)
return
}
_, err := ParseJWT(tokenStr, "your_secret_key")
if err != nil {
http.Error(w, "Invalid token", http.StatusUnauthorized)
return
}
next(w, r)
}
}
总结
使用 jwt-go
与 go-zero
集成是相对直接的,通过这些步骤,你可以轻松地在 Go 应用程序中实施基于 JWT 的身份验证。根据具体需求,可以扩展 Claims 或添加更多功能,比如刷新令牌等。
内容由零声教学AI助手提供,问题来源于学员提问