在设置了一个简单的has many关联之后,其中user has\u many post要创建一个具有用户ID的帖子,似乎有必要解析jwt声明以获取用户ID并将其放置在帖子创建中.

那么,如何从jwt声明中获取用户ID

我试着解析令牌,但还是出现了

map[email:teste@teste.com exp:1.655701949e+09 username:teste]



tokenString := c.GetHeader("Authorization")
    //
claims := jwt.MapClaims{}
token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
    return []byte("supersecretkey"), nil
})

if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
    fmt.Printf("%v", claims )
} else {
    fmt.Println(err)
}

推荐答案

我从一开始就告诉过你,当你想生成JWT时

token := jwt.New(jwt.SigningMethodHS256)
// Set claims
// This is the information which frontend can use
// The backend can also decode the token and get admin etc.
claims := token.Claims.(jwt.MapClaims)
claims["username"] = ID
accessTokenExpireTime := time.Now().Add(time.Hour * 48).Unix()
claims["exp"] = accessTokenExpireTime
// Generate encoded token and send it as response.
// The signing string should be secret (a generated UUID works too)
t, err := token.SignedString([]byte("AccessToken"))

然后,当你想解码用户名时,请执行以下操作:

type MyCustomClaims struct {
        Username string `json:"username"`
        jwt.StandardClaims
    }

    auth := c.Request.Header.Get("Authorization")
    if auth == "" {
        c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"Message": "Authorization Header Not Found"})
        return
    }
    splitToken := strings.Split(auth, "Bearer ")
    auth = splitToken[1]

    token, err := jwt.ParseWithClaims(auth, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
        return []byte("AccessToken"), nil
    })

    if err != nil {
        c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"Message": "Token is wrong or Expire"})
        return
    }


    if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
        log.Printf("%v %v", claims.Username, claims.StandardClaims.ExpiresAt)
    }

Go相关问答推荐

Golang regexpp:获取带有右括号的单词

无法在Macos上使用Azure Speech golang SDK

如何在Golang中覆盖404

文件路径.Abs()未在结果中提供子目录

Golang在不写入磁盘的情况下为jpeg图像生成一致的哈希

启动套接字服务器会干扰 gRPC/http 客户端服务器通信 Golang

判断一个区域内的纬度/经度点

是否可以从 golang 中的参数推断类型?

当图像是对象数组的元素时,如何显示存储为页面资源的图像?

创建新对象后如何返回嵌套实体?

为什么不同的 Wireguard 私钥会产生相同的公钥?

Golang 通过接口反映/迭代{}

Golang并发写入多个文件

有没有办法在 golang 中定义可索引类型?

为什么我不能使用来自 gocloak 中 Login() 的访问令牌在 KeyCloak 中创建新客户端?

使用正则表达式拆分具有相同标题的数据块

Go 使用 struct 作为接口而不实现所有方法

如何从 docker-compose 命令运行 2 个不同的命令:

使用不安全的指针从 [] 字符串中获取值

并发 map map导致的 Golang 数据竞争