首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JWT标头中编码映射

在JWT标头中编码映射
EN

Stack Overflow用户
提问于 2020-11-13 06:07:04
回答 2查看 164关注 0票数 0

我试图弄清楚如何使用以下JWT库在JWT中对地图进行编码:

代码语言:javascript
复制
https://github.com/dgrijalva/jwt-go

我需要能够生成的JWT具有以下有效负载:

代码语言:javascript
复制
{
  "iss": "id.example.com",
  "aud": "notify",
  "iat": 1602681257,
  "exp": 1602682157,
  "payload": {
    "data": {
      "name": "bob",
      "id": "123456",
    },
    "type": "CUSTOM"
  },
  "env": "integration",
}

标准声明很容易生成,但我无法从文档中找出如何在"payload“下生成数据,因为它不是单个值,而是一个映射。我目前拥有的测试代码如下:

代码语言:javascript
复制
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中生成其余的声明?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-13 06:27:40

您的部分问题是您试图在JWT头中定义您的自定义有效负载,而您确实希望在claims部分中定义它。

jwt包提供了一种MapClaims类型,允许您以松散类型的方式定义声明。如果你想在你的声明上有更强的类型,你可以使用结构嵌入来定义你自己的声明类型,如下所示:

代码语言:javascript
复制
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)
}
票数 0
EN

Stack Overflow用户

发布于 2020-11-13 06:15:40

使用MapClaims:

代码语言:javascript
复制
   claims:=map[string]interface{} {
      "payload": map[string]interface{} {
       ...
       },
       ...
   }
   token := jwt.NewWithClaims(jwt.SigningMethodES256, jwt.MapClaims(claims))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64812501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档