You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用github.com/dgrijalva/jwt-go创建JWT时,公钥应在哪里配置?

关于dgrijalva/jwt-go库中JWT生成时公钥配置位置的疑问

Hey there, let's break this down clearly for you.

首先看你当前的实现代码:

func CreateToken(userid uint64) (string, error) {
    var err error
    //Creating Access Token
    os.Setenv("ACCESS_SECRET", "jdnfksdmfksd") //this should be in an env file
    atClaims := jwt.MapClaims{}
    atClaims["authorized"] = true
    atClaims["user_id"] = userid
    atClaims["exp"] = time.Now().Add(time.Minute * 15).Unix()
    at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
    token, err := at.SignedString([]byte(os.Getenv("ACCESS_SECRET")))
    if err != nil {
        return "", err
    }
    return token, nil
}

核心原因:你用的是对称加密算法,不需要单独配置公钥

你当前使用的SigningMethodHS256是HMAC对称加密算法——这类算法的特点是,生成Token的签名和验证Token的签名,用的是同一个密钥(就是你现在的ACCESS_SECRET)。所以在这种场景下,根本不存在「单独配置公钥」的步骤,这也是你的功能能正常运行的原因。

什么时候需要公钥?

如果想切换到非对称加密算法(比如RS256),才需要一对公钥和私钥:

  • 生成Token时:用私钥进行签名(私钥需要严格保密)
  • 验证Token时:用公钥进行验签(公钥可以安全地分发给所有需要验证Token的服务)

如果你确实要改用RS256,这里给你调整后的代码示例:

生成Token(用私钥)

func CreateToken(userid uint64) (string, error) {
    // 建议从环境变量/配置文件加载私钥,不要硬编码
    privateKeyStr := os.Getenv("RSA_PRIVATE_KEY")
    privateKey, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(privateKeyStr))
    if err != nil {
        return "", err
    }

    atClaims := jwt.MapClaims{}
    atClaims["authorized"] = true
    atClaims["user_id"] = userid
    atClaims["exp"] = time.Now().Add(time.Minute * 15).Unix()

    // 使用RS256非对称签名方法
    at := jwt.NewWithClaims(jwt.SigningMethodRS256, atClaims)
    token, err := at.SignedString(privateKey)
    if err != nil {
        return "", err
    }
    return token, nil
}

验证Token(用公钥)

import "fmt"

func ValidateToken(tokenStr string) (*jwt.Token, error) {
    // 加载公钥
    publicKeyStr := os.Getenv("RSA_PUBLIC_KEY")
    publicKey, err := jwt.ParseRSAPublicKeyFromPEM([]byte(publicKeyStr))
    if err != nil {
        return nil, err
    }

    return jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
        // 先验证签名方法是否符合预期
        if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        // 返回公钥用于验签
        return publicKey, nil
    })
}

总结

  • 你当前的HS256方案:不需要公钥,一个共享密钥同时负责签名和验签
  • 切换到RS256等非对称方案:生成Token时只用私钥,公钥仅在验证环节使用,不需要在生成Token的代码里配置

内容的提问来源于stack exchange,提问作者Pat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:32:56