我试图弄清楚如何使用以下JWT库在JWT中对地图进行编码:
https://github.com/dgrijalva/jwt-go我需要能够生成的JWT具有以下有效负载:
{
"iss": "id.example.com",
"aud": "notify",
"iat": 1602681257,
"exp": 1602682157,
"payload": {
"data": {
"name": "bob",
"id": "123456",
},
"type": "CUSTOM"
},
"env": "integration",
}标准声明很容易生成,但我无法从文档中找出如何在"payload“下生成数据,因为它不是单个值,而是一个映射。我目前拥有的测试代码如下:
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"fmt"
"github.com/dgrijalva/jwt-go"
"time"
)
func main() {
key, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
timestamp := time.Now().Unix()
claims := jwt.StandardClaims{
Audience: "notify",
ExpiresAt: timestamp + 60,
Issuer: "id.example.com",
IssuedAt: timestamp,
}
token := jwt.NewWithClaims(jwt.SigningMethodES256, claims)
token.Header["kid"] = "foobar"
tokenString, _ := token.SignedString(key)
fmt.Println(tokenString)
}如何在JWT中生成其余的声明?
发布于 2020-11-13 06:27:40
您的部分问题是您试图在JWT头中定义您的自定义有效负载,而您确实希望在claims部分中定义它。
jwt包提供了一种MapClaims类型,允许您以松散类型的方式定义声明。如果你想在你的声明上有更强的类型,你可以使用结构嵌入来定义你自己的声明类型,如下所示:
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"fmt"
"time"
"github.com/dgrijalva/jwt-go"
)
type payload struct {
Data map[string]string `json:"data,omitempty"`
Type string `json:"type,omitempty"`
}
type customClaims struct {
jwt.StandardClaims
Payload payload `json:"payload,omitempty"`
Env string `json:"env,omitempty"`
}
func main() {
key, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
timestamp := time.Now().Unix()
claims := customClaims{
StandardClaims: jwt.StandardClaims{
Audience: "notify",
ExpiresAt: timestamp + 60,
Issuer: "id.example.com",
IssuedAt: timestamp,
},
Env: "integration",
Payload: payload{
Type: "CUSTOM",
Data: map[string]string{
"name": "bob",
"id": "123456",
},
},
}
token := jwt.NewWithClaims(jwt.SigningMethodES256, claims)
tokenString, _ := token.SignedString(key)
fmt.Println(tokenString)
}发布于 2020-11-13 06:15:40
使用MapClaims:
claims:=map[string]interface{} {
"payload": map[string]interface{} {
...
},
...
}
token := jwt.NewWithClaims(jwt.SigningMethodES256, jwt.MapClaims(claims))https://stackoverflow.com/questions/64812501
复制相似问题