我正在创建访问,刷新令牌逻辑,我想判断访问令牌是否有效(未编辑),即使它已过期.如果令牌过期,则GO返回错误并使令牌无效.因此,我判断给定的错误是否与ErrTokenExpired匹配.

我可以if !tkn.Valid{...%确定如果令牌无效,则错误不会为零,所以我可以删除if !tkn.Valid{...吗?

这通常是一种好的方法还是编辑过的令牌可以通过我的验证?

func VerifyJWT(jwtString, secret string) (*jwt.Token, *Claims, error) {
    claims := &Claims{}
    tkn, err := jwt.ParseWithClaims(jwtString, claims, func(token *jwt.Token) (interface{}, error) {
        return []byte(os.Getenv(secret)), nil
    })
    return tkn, claims, err
}
    _, accClaims, err1 := VerifyJWT(req.Access, "ACCESS_SECRET")
    if err1 != nil && err1.Error()[:16] != jwt.ErrTokenExpired.Error()[:16] {
        WriteJSON(w, http.StatusBadRequest, APIError{Error: "invalid token access" + err1.Error()})
        return
    }

推荐答案

如果您代码中有两点,则JWT令牌是安全的:

1- choose good algorithm
2- create random secret key

如果令牌更改或超时,这两个 Select 可以帮助您和VerifyJWT返回错误!

注意:您总是需要判断错误,并向客户返回良好的响应.


注意(改进您的代码):为了判断一个错误是ErrTokenExpired,请使用errors pkg.

您的示例:

// import "errors"


_, accClaims, err := VerifyJWT(req.Access, "ACCESS_SECRET")
if errors.Is(err, jwt.ErrTokenExpired) {
        // continue progress
}

if err != nil {
    WriteJSON(w, http.StatusUnauthorized, APIError{Error: err.Error()})
    return
}

Go相关问答推荐

一种基于时间的Golang函数节制器

mockgen不创建模拟

如何在围棋中从多部分.Part中获取多部分.文件而不保存到磁盘?

如何将Golang测试用例的测试覆盖率值与特定阈值进行比较

杜松子wine 和中间件

Secrets Manager Update Secret - Secret String 额外的 JSON 编码

Exchange Web 服务 - 使用 soap xml 请求查找所有未读邮件

Yocto 无法交叉编译 GoLang Wails 应用程序

如果值为 false,gRPC 不返回布尔值

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

不能使用 mockDB(*MockDB 类型的变量)作为 struct 文字中的 *gorm.DB 值

从动态输入中提取字符串,其中部分字符串可能不存在

从 os.stdout 读取

vs 代码调试 go 测试不通过标志

如何在 Windows 上使用 cgo 为 386 arch 构建 lib?

Go GCP 同时模拟两个服务帐户

Go:用于 XML 解码的嵌套 struct 中的提升字段

Golang - 使用正则表达式提取链接

gopls 为 github.com/Shopify/sarama 返回错误gopls: no packages returned: packages.Load error

Gorilla/Mux 和 Websocket 竞赛条件,这安全吗?