JWT 标头中的编码映射

我试图弄清楚如何使用以下 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 中生成其余声明?


DIEA
浏览 135回答 2
2回答

江户川乱折腾

您的部分问题是,当您在声明部分中确实需要它时,您正试图在 JWT 标头中定义您的自定义有效负载。jwt 包提供了一种MapClaims类型,允许您以松散类型的方式定义您的声明。如果您想对您的声明进行更强的输入,您可以使用结构嵌入来定义您自己的声明类型,方法是执行以下操作:package mainimport (    "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)}

白猪掌柜的

使用 MapClaims:   claims:=map[string]interface{} {      "payload": map[string]interface{} {       ...       },       ...   }   token := jwt.NewWithClaims(jwt.SigningMethodES256, jwt.MapClaims(claims))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go