在Go中解析JSON Web令牌声明

时间:2018-03-20 03:26:15

标签: go jwt

我正在尝试使用JSON Web令牌进行一些身份验证,并且我已设法使用正确的声明生成令牌,但我无法解析声明后续请求。

我的令牌看起来像这样

{
    "Raw": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
    "Method": {
        "Name": "RS256",
        "Hash": 5
    },
    "Header": {
        "alg": "RS256",
        "typ": "JWT"
    },
    "Claims": {
        "foo": "bar"
    },
    "Signature": "",
    "Valid": false
}

我的目标是解析声明中的foo值。我正在使用this包来处理网络令牌。

我能够从Authorization标题中成功提取令牌,但是当我尝试这个时

token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    return apiKeyPair.PublicKey, nil
})

if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
    return claims, nil
} else {
    return nil, err
}

我在这里没有收到错误,但是当我尝试从这样的声明中访问foo

claims, err := GetWebTokenClaims(r)
if err != nil {
    return
}

foo := claims["foo"]

我得到nil。我已尝试对此结构进行一些小调整 - 就像使用ParseWithClaims()方法一样使用custom claims - 但对于我的生活,我无法让这个简单的事情发挥作用。

不确定从何处开始或其他相关信息可能相关,欢迎任何帮助!

1 个答案:

答案 0 :(得分:0)

定义描述声明的类型,其中包含jwt.StandardClaims

type myClaims struct {
    Foo    string   `json:"foo"`
    jwt.StandardClaims
}

如果您使用此data

的JWT
{
  "foo": "bar"
}

您可以访问以下声明:

parsedToken, err := jwt.Parse(signed, keyfunc)
if err != nil {
    fmt.Println("token is invalid: ", err)
} else {
    claims := parsedToken.Claims.(jwt.MapClaims)
    fmt.Println(claims["foo"])
}