go - 如何在 jwt-go ParseWithClaims 中使用 RSA 解析 JWT token ?

标签 go jwt-go

我开发了以下方法,它应该启用基于 token 的身份验证 (jwt)。应使用异步过程来生成 token 。

源代码似乎一直到签名 token 的生成都有效。 我在使用 ParseWithClaims 查询 token 时遇到问题。有人可以帮忙吗?

package controllers

import (
    "crypto/rand"
    rsaKeys "crypto/rsa"
    "fmt"

    jwtgo "github.com/dgrijalva/jwt-go"
    "github.com/gofiber/fiber"
)

func Login(c *fiber.Ctx) error {
    
    type TestClaims struct {
        HAPP string `json:"happ"`
        jwtgo.StandardClaims
    }

    currentPrivateKey, err := rsaKeys.GenerateKey(rand.Reader, 512)

    claims := TestClaims{
        "owa",
        jwtgo.StandardClaims{
            Issuer:    "test",
            ExpiresAt: 15000,
        },
    }

    token := jwtgo.NewWithClaims(jwtgo.SigningMethodRS256, claims)

    tokenSigned, err := token.SignedString(currentPrivateKey)
    if err != nil {
        fmt.Printf("Failed to sign in account %v", err)
    }

    //Issue is in this statement
    _, errTest := jwtgo.ParseWithClaims(tokenSigned, &TestClaims{"owa", jwtgo.StandardClaims{}}, func(token *jwtgo.Token) (interface{}, error) {
        return currentPrivateKey, nil
    })

    if errTest != nil {
        fmt.Printf("Error Message: %v", errTest) //Does throw error: key is of invalid type
    }

    return c.JSON(fiber.Map{
        "message": "success",
    })
}

最佳答案

要验证 JWT,您需要public key ,特别是ParseWithClaims 需要*rsa.PublicKey 类型的 key 。

您可以使用 PrivateKey.Public 从私钥中获取它:

tok, err := jwtgo.ParseWithClaims(tokenSigned, &TestClaims{"owa", jwtgo.StandardClaims{}}, func(token *jwtgo.Token) (interface{}, error) {
    return currentPrivateKey.Public(), nil
})

请注意 dgrijalva/jwt-gounmaintained .如果可以,切换到社区分支 golang-jwt/jwt ,其中包括重要的安全修复程序。

关于go - 如何在 jwt-go ParseWithClaims 中使用 RSA 解析 JWT token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68481150/

相关文章:

Golang 和 JWT - 简单注销

go - 如何使用 jwt-go 库验证 JSON Web Token?

go - 如何覆盖 DefaultHTTPErrorHandler 格式消息

go - golang中指针内容的差异

html - Docker未反射(reflect)对HTML文件的更改

Golang - 解析嵌套的 JSON

go - 登录后如何自动添加JWT?

go - 使用Go和Waitgroups并行获取数据

go - 在 Go 中使用 c 风格迭代器的惯用方式

go 并使用 jwt-go 解析 token