为了账号安全,请及时绑定邮箱和手机立即绑定

JWT 标头中的编码映射

JWT 标头中的编码映射

Go
DIEA 2022-07-11 16:56:30
我试图弄清楚如何使用以下 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",}标准声明很容易产生,但我无法从文档中弄清楚如何在“有效负载”下生成数据,因为它不是一个单一的值,而是一个地图。我目前拥有的测试代码如下: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 中生成其余声明?
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

您的部分问题是,当您在声明部分中确实需要它时,您正试图在 JWT 标头中定义您的自定义有效负载。


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)

}


查看完整回答
反对 回复 2022-07-11
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

使用 MapClaims:


   claims:=map[string]interface{} {

      "payload": map[string]interface{} {

       ...

       },

       ...

   }

   token := jwt.NewWithClaims(jwt.SigningMethodES256, jwt.MapClaims(claims))


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信