Я попытался применить gin-jwt к бэкенду (gin) моего приложения реагирования, хочу получить идентификатор пользователя и информацию о роли.для RBAC.я могу войти в систему и получить токен соответственно, но когда я попытался получить информацию о роли из функции LoginResponse, поле ID пользователя и роли было пустым.
Я хочу знать поток входа в систему, почему он не работает?
PayloadFunc:
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:
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
})
},