我尝试将 gin-jwt 应用于我的 React 应用程序的后端 (gin),想要获取用户 ID 和角色信息。对于 RBAC。我可以登录并相应地获取 token ,但是当我尝试从 LoginResponse 函数获取角色信息时,用户 ID 和角色字段为空。
我想知道登录的流程,为什么它不起作用?
有效载荷函数:
authMiddleware, err := jwt.New(&jwt.GinJWTMiddleware{
Realm: "test zone",
Key: []byte("mysecretkey"),
Timeout: time.Hour,
MaxRefresh: time.Hour,
IdentityKey: identityKey,
PayloadFunc: func(data interface{}) jwt.MapClaims {
if v, ok := data.(*User); ok {
return jwt.MapClaims{
identityKey: v.UserName,
role: v.Role,
email: v.Email,
}
}
return jwt.MapClaims{}
},
验证器:
Authenticator: func(c *gin.Context) (interface{}, error) {
var loginVals Login
if err := c.BindJSON(&loginVals); err != nil {
return "", jwt.ErrMissingLoginValues
}
plainpass := loginVals.Password
session, err := mgo.Dial(SERVER)
ce(err)
colQuerier := bson.M{"username": loginVals.Username}
err = session.DB(DATABASE).C("asys_users").Find(colQuerier).One(&loginVals)
ce(err)
defer session.Close()
if CheckPasswordHash(plainpass, loginVals.Password) {
return &User{
UserName: loginVals.Username,
Role: loginVals.Role,
Email: loginVals.Email,
}, nil
}
return nil, jwt.ErrFailedAuthentication
},
登录响应:
LoginResponse: func(c *gin.Context, code int, token string, expire time.Time) {
claims := jwt.ExtractClaims(c)
fmt.Println(claims) . // only map[], nothing
c.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"token": token,
"expire": expire.Format(time.RFC3339),
"userid": claims["id"], // this field is null
"role": claims["role"], // this field is null
"email": claims["email"], // this field is null
})
},
最佳答案
您无法从登录端点获取 extractClaims,因为授权 header 上没有 token 。作弊方式是将一个新变量设置为 Authenticator 函数的上下文。
关于go - 无法获取额外信息。来自 gin-jwt 中的登录响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55121893/