go - 无法获取额外信息。来自 gin-jwt 中的登录响应

标签 go jwt

我尝试将 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/

相关文章:

amazon-web-services - 如何在Go AWS SDK v2中使用IAM用户凭证

node.js - 用于 Web 应用程序 JWT 的 Nodejs Express,带有数据库或 session 来对用户进行身份验证

node.js - 保护我的 HTTP 连接

go - 比较两个 slice

sql: 扫描列数未知的行 (select * from ...)

go - 与 make channel 相关的奇怪死锁

go - 逃避反弹golang

jwt - 在标题或正文上传递 jwt 刷新 token

node.js - express-jwt 通过路由处理特定的 secret 密码

java - 如何使用 S4 Cloud SDK 连接访问 RabbitMQ 后面的目标服务