我目前正在开发一个 Go 应用程序。我从客户端收到一个 JWT 令牌,我需要解码该令牌并获取相关信息:用户、名称等。
我正在检查可用于处理 JWT 令牌的库,结果是 dgrijalva/jwt-go
,但我看不出如何以简单的方式实现我的目标。
我有令牌,我需要将信息解码为地图或至少是 json。我该怎么做?
原文由 Sredny M Casanova 发布,翻译遵循 CC BY-SA 4.0 许可协议
我目前正在开发一个 Go 应用程序。我从客户端收到一个 JWT 令牌,我需要解码该令牌并获取相关信息:用户、名称等。
我正在检查可用于处理 JWT 令牌的库,结果是 dgrijalva/jwt-go
,但我看不出如何以简单的方式实现我的目标。
我有令牌,我需要将信息解码为地图或至少是 json。我该怎么做?
原文由 Sredny M Casanova 发布,翻译遵循 CC BY-SA 4.0 许可协议
免责声明:我不隶属于图书馆。我只是一个用户,觉得有用,愿意分享。
现在是 2019 年。我想推荐一个 替代库,它使用 JWS 和/或 JWE 在 JWT 上做得很好。
以下是有关如何使用该库的几个示例:
import (
"gopkg.in/square/go-jose.v2/jwt"
"gopkg.in/square/go-jose.v2"
)
...
var claims map[string]interface{} // generic map to store parsed token
// decode JWT token without verifying the signature
token, _ := jwt.ParseSigned(tokenString)
_ = token.UnsafeClaimsWithoutVerification(&claims)
// decode JWT token and verify signature using JSON Web Keyset
token, _ := jwt.ParseSigned(tokenString)
jwks := &jose.JSONWebKeySet { // normally you can obtain this from an endpoint exposed by authorization server
Keys: []jose.JSONWebKey { // just an example
{
Key: publicKey,
Algorithm: jose.RS256, // should be the same as in the JWT token header
KeyID: "kid", // should be the same as in the JWT token header
},
},
}
_ = jwt.Claims(jwks, &claims)
请注意, claims
可以是包含默认 JWT 字段以及令牌内自定义字段的结构,例如:
import (
"github.com/mitchellh/mapstructure"
"gopkg.in/square/go-jose.v2/jwt"
)
...
type CustomClaims struct {
*jwt.Claims
// additional claims apart from standard claims
extra map[string]interface{}
}
func (cc *CustomClaims) UnmarshalJSON(b []byte) error {
var rawClaims map[string]interface{}
if err := json.Unmarshal(b, &rawClaims); err != nil {
return nil
}
var claims jwt.Claims
var decoderResult mapstructure.Metadata
decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
Result: &claims,
Metadata: &decoderResult,
TagName: "json",
})
if err != nil {
return err
}
if err := decoder.Decode(rawClaims); err != nil {
return err
}
cc.Claims = &claims
cc.extra = make(map[string]interface{})
for _, k := range decoderResult.Unused {
cc.extra[k] = rawClaims[k]
}
return nil
}
我还构建 了一个命令行工具,使用该 库 执行各种编码/解码活动。它也可能是有关库用法的有用参考。
原文由 trung 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
6 回答6.9k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答2k 阅读✓ 已解决
1 回答3.4k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
函数
jwt.ParseWithClaims
接受接口jwt.Claims
作为第二个参数。除了基于结构的自定义声明,该包还提供map
基于声明,即jwt.MapClaims
。因此,您可以简单地将令牌解码为MapClaims
,例如