目录
在 API 开发中,JSON Web Tokens(JWT)验证是保障接口安全的重要手段。然而,当 JWT 验证失败时,默认的响应往往不够友好或无法满足特定业务需求。本文将详细讲解如何自定义 JWT 验证失败的响应,包括创建自定义错误结构体、修改验证逻辑以及在 API 接口中处理自定义错误。
一、创建自定义错误结构体
- 定义结构体
- 在项目中创建一个
error目录(可根据实际项目结构调整),在该目录下创建jwt_error.go文件。 - 定义一个
JWTError结构体,包含Code(错误码,整数类型)和Message(错误消息,字符串类型)字段。 - 示例代码如下:
- 在项目中创建一个
package error
type JWTError struct {
Code int
Message string
}
func (e *JWTError) Error() string {
return e.Message
}
二、修改 JWT 验证逻辑
- 调整验证函数(ValidateJWT)
- 在
user/info/logic/userinfologic.go或专门用于 JWT 验证的工具文件中,修改ValidateJWT函数。 - 当 JWT 验证出现错误时,返回
JWTError结构体实例,而不是原始的错误信息。 - 示例代码如下:
- 在
func ValidateJWT(tokenString string, secret string) (*jwt.Token, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
// 验证签名算法
if _, ok := token.Method.(*jwt.SigningMethodHMAC);!ok {
return nil, &error.JWTError{Code: 401, Message: "无效的签名算法"}
}
// 返回密钥
return []byte(secret), nil
})
if err!= nil {
return nil, &error.JWTError{Code: 401, Message: "JWT验证失败: " + err.Error()}
}
if!token.Valid {
return nil, &error.JWTError{Code: 401, Message: "无效的JWT令牌"}
}
return token, nil
}
三、在 API 接口中处理自定义错误
- 获取用户信息接口处理(user/info/logic/userinfologic.go)
- 在获取用户信息接口的逻辑处理函数中,对
ValidateJWT函数的返回错误进行处理。 - 当接收到
JWTError结构体类型的错误时,将其转换为相应的响应格式返回给客户端。 - 示例代码如下:
- 在获取用户信息接口的逻辑处理函数中,对
func (l *UserInfoLogic) UserInfo(req *types.UserInfoReq) (resp *types.UserInfoResp, err error) {
tokenString := req.Header.Get("Authorization")
token, err := ValidateJWT(tokenString, l.svcCtx.Config.Jwt.Secret)
if err!= nil {
if jwtErr, ok := err.(*error.JWTError); ok {
return &types.UserInfoResp{
Code: jwtErr.Code,
Message: jwtErr.Message,
}, nil
}
return nil, err
}
// 解析JWT令牌中的用户信息并获取用户数据
claims, ok := token.Claims.(jwt.MapClaims)
if!ok {
return nil, fmt.Errorf("无效的JWT令牌Claims")
}
userID, ok := claims["userid"].(float64)
if!ok {
return nil, fmt.Errorf("无效的用户ID在JWT令牌中")
}
username, ok := claims["username"].(string)
if!ok {
return nil, fmt.Errorf("无效的用户名在JWT令牌中")
}
// 根据用户信息获取用户数据并返回响应
//...
return &types.UserInfoResp{
Code: 0,
Message: "成功",
Data: types.UserInfoData{
Userid: uint(userID),
Username: username,
},
}, nil
}
四、总结
通过以上步骤,我们实现了自定义 JWT 验证失败的响应。这样,当 JWT 验证出现问题时,API 能够返回更清晰、更符合业务需求的错误信息给客户端。在实际项目中,这种自定义响应有助于前端开发人员更好地理解错误原因并进行相应处理,同时也提升了整个 API 的用户体验和可维护性。此外,还可以进一步扩展JWTError结构体,添加更多错误相关的信息,如错误发生的时间、错误来源等,以便更好地进行错误追踪和分析。
149

被折叠的 条评论
为什么被折叠?



