首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我有一个公钥和一个JWT,如何在Go中检查它是否有效?

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

Stack Overflow用户
提问于 2018-08-14 13:25:46
回答 2查看 3.6K关注 0票数 10

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

代码语言:javascript
复制
-----BEGIN PUBLIC KEY-----
THIS
-----END PUBLIC KEY-----

和来自我的客户端的JWT令牌。

如何根据密钥检查令牌?我在使用jwt-go时遇到了困难,因为解析函数接受令牌字符串和一个getKey函数。

不确定到底该如何进行

EN

回答 2

Stack Overflow用户

发布于 2018-08-14 16:14:17

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

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

Stack Overflow用户

发布于 2018-08-14 13:29:38

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

代码语言:javascript
复制
token, err := p.Parse(IDToken, func(*jwt.Token) (interface{}, error) {
    return []byte(signingKey), nil
})

并且它将对照密钥来验证令牌。

引用documentation的话,

类型Keyfunc函数(*Token)(接口{},错误)

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51834234

复制
相关文章

相似问题

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