我有一个公钥和一个 JWT,我如何检查它在 Go 中是否有效?

Dav*_*lsh 9 go jwt jwt-go

我有来自我的身份提供者的公钥

-----BEGIN PUBLIC KEY-----
THIS
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

以及来自我客户的 JWT 令牌。

如何根据密钥检查令牌?我遇到了困难,jwt-go因为 Parse 函数需要令牌字符串和一个getKey函数。

不确定如何进行

小智 11

令牌由 RSA 算法签名,该算法使用私钥进行签名并使用公钥进行验证。将您的公钥存储到文件系统并用于jwt.SigningMethodRS256.Verify()验证。如以下片段:

package main

import (
    "fmt"
    "strings"
    "log"
    "io/ioutil"
    jwt "github.com/dgrijalva/jwt-go"
)

func main() {
    publicKeyPath := "~/public_key.key"
    token := "your_jwt_token_here"

    if isValid, err := verifyToken(token, publicKeyPath)
    if err != nil {
        log.Fatal(err)
    }

    if isValid {
        fmt.Println("The token is valid")
    } else {
        fmt.Println("The token is invalid")
    }
}

func verifyToken(token, publicKeyPath string) (bool, error) {
    keyData, err := ioutil.ReadFile(publicKeyPath)
    if err != nil {
        return false, err
    }
    key, err := jwt.ParseRSAPublicKeyFromPEM(keyData)
    if err != nil {
        return false, err
    }

    parts := strings.Split(token, ".")
    err = jwt.SigningMethodRS256.Verify(strings.Join(parts[0:2], "."), parts[2], key)
    if err != nil {
        return false, nil
    }
    return true, nil
}
Run Code Online (Sandbox Code Playgroud)


Ull*_*kut 6

使用jwt-go,你可以做到这一点

token, err := p.Parse(IDToken, func(*jwt.Token) (interface{}, error) {
    return []byte(signingKey), nil
})
Run Code Online (Sandbox Code Playgroud)

它将根据密钥验证令牌。

引用文档

type Keyfunc func(*Token) (interface{}, error)

解析方法使用此回调函数来提供用于验证的密钥。该函数接收已解析但未经验证的 Token。这允许您使用令牌的 Header 中的属性(例如kid)来标识要使用的密钥。