1

我在 golang 中使用包“github.com/dgrijalva/jwt-go”来验证 api 命中。

创建 jwt 令牌的代码是:

token := jwt.NewWithClaims(jwt.SigningMethodHS256, &jwt.MapClaims{
        "email":      "test@example.com",
        "exp":        time.Now().Add(time.Hour * 8760).Unix(),
        "role":       "customer",
        "name":       "John Doe",
        "ip":         0.0.0.0,
        "user_agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0"
        "id":         1,
    })
tokenString, err := token.SignedString([]byte(config.SignKey))

以下是使用此令牌的步骤:

  1. 第一次登录 api 命中,我们调用上面的方法来生成令牌并在 api 响应中返回这个令牌。
  2. 之后,另一个 api 在其标头中使用“Bearer”字符串包含此标记。我们解码此令牌并通过以下代码对其进行身份验证:

    bearer := strings.Split(c.Request.Header["Authorization"][0], "Bearer")
    bearerToken := strings.TrimSpace(bearer[1])
    token, err := jwt.Parse(bearerToken, func(token *jwt.Token) (interface{}, error) {return config.SignKey, nil})
    if err != nil {
        c.JSON(200, gin.H{"response": "{error: "err", msg: Session Expired. Please log out and back in to continue2.}",})
        c.Abort()
        return
    }
    

现在假设令牌被解码为 url:http: //SOMEDOMAIN.COM/api/v1/SOMEAPI

从这个 api 我发出了另一个 curl 命令,格式如下:

"curl --header 'Ip: " + ip + "' --header 'User-Agent: " + userAgent + "' --header 'Authorization: " + token + "' 'http://SOMEDOMAIN.COM/api/v2/ANOTHERAPI'"

此命令命中另一个不同的 api,但使用相同的凭据(如令牌)与从登录 api 创建的凭据相同。

具有不同 url 的两个 api 都托管在同一服务器上,但 golang 项目文件夹不同。

现在这个包不验证令牌并给出以下错误:

{"response":{"code":400,"api_status":10,"message":"Session Expired. Please log out and back in to continue2.","data":{"Inner":{},"Errors":4}}}

在这种情况下,我正在寻找错误代码 4 的含义。

谁能解释一下它的含义Error: 4以及为什么它在不同的api url上表现得这样?

4

1 回答 1

1

当我调查你的代码时,

您的 有误用config.SignKey,似乎[]byte在签署令牌时正在投射。

但是在解析你的令牌时;

{return config.SignKey, nil}

您使用了默认类型并且没有强制转换[]byte

 {return []byte(config.SignKey), nil}

我认为这是问题所在。

于 2019-09-26T08:40:31.033 回答