go-zero如何用jwt存储需要的信息并获取

文章介绍了如何在JWT(JSONWebToken)鉴权过程中存储和检索用户ID。在生成JWT时,将userID作为MapClaims的一部分保存,然后在解析JWT时,通过Context获取存储的userID。在API处理函数中,JWT信息会被放入http.Request的Context,允许通过Context直接访问所需值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JWT鉴权中,可以使用context获取存储的信息

需求:在生成jwt的时候,保存UserID。并在解析jwt数据的时候,获取到UserID。
生成token代码

var CtxKeyJwtUserId = "jwtUserId"
func (l *GenerateTokenLogic) getJwtToken(secretKey string, iat, seconds, userId int64) (string, error) {
	claims := make(jwt.MapClaims)
	claims["exp"] = iat + seconds
	claims["iat"] = iat
	claims[ctxData.CtxKeyJwtUserId] = userId	// 存入userId
	token := jwt.New(jwt.SigningMethodHS256)
	token.Claims = claims
	return token.SignedString([]byte(secretKey))
}

获取userId代码

func GetUidFromCtx(ctx context.Context) int64 {
	var uid int64
	if jsonUid, ok := ctx.Value(CtxKeyJwtUserId).(json.Number); ok {
		if int64Uid, err := jsonUid.Int64(); err == nil {
			uid = int64Uid
		} else {
			logx.WithContext(ctx).Errorf("GetUidFromCtx err : %+v", err)
		}
	}
	return uid
}

解析

前提
需要在api文件中对应方法前面加上 : jwt:xxxx
在这里插入图片描述
go-zero从jwt token解析后会将用户生成token时传入的kv原封不动的放在http.Request的Context中,因此我们可以通过Context就可以拿到你想要的值

Go-Zero框架中集成JWT(JSON Web Token)进行身份验证通常包含以下几个步骤: 1. **安装依赖**: 首先需要安装`github.com/dgrijalva/jwt-go`库,它是一个轻量级的JWT处理包。可以使用go get命令安装: ``` go get github.com/dgrijalva/jwt-go ``` 2. **设置JWT密钥**: 创建一个私钥(secret key),这个密钥将在签发JWT时使用。例如,你可以将其作为环境变量存储: ```bash export JWT_SECRET_KEY="your-secret-key" ``` 3. **创建认证中间件**: 在Go-Zero应用中创建一个新的中间件函数,该函数会在每个请求之前检查JWT。这里有一个简单的示例: ```go import ( "context" "github.com/gin-gonic/gin" jwt "github.com/dgrijalva/jwt-go" ) func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { tokenString := c.GetHeader("Authorization") if tokenString == "" { c.AbortWithStatus(http.StatusUnauthorized) return } // 解析token 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 []byte(os.Getenv("JWT_SECRET_KEY")), nil }) if err != nil { c.AbortWithStatus(http.StatusUnauthorized) return } // 检查token是否有效 if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { // 在这里添加对claims的验证,把验证后的用户信息保存到上下文中 user := claims["sub"].(string) ctx := context.WithValue(c.Request.Context(), "user", user) c.SetContext(ctx, c) next(c) } else { c.AbortWithStatus(http.StatusUnauthorized) } } } ``` 4. **保护路由**: 将AuthMiddleware应用于你需要授权访问的路由前: ```go router.GET("/protected", AuthMiddleware, yourController.MethodThatNeedsAuth) ``` 5. **刷新令牌**(可选): 如果需要提供token刷新功能,可以在鉴权成功后返回一个有效期更长的新token。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值