go - 与公钥和私钥以及 JWT 相关的混淆

标签 go google-app-engine jwt jwt-go

我正在 Go 网络服务中试用 JWT(JSON 网络 token )。这是我到目前为止所做的:

package jwt

import(
    "fmt"
    "net/http"
    "github.com/gorilla/mux"
    "github.com/dgrijalva/jwt-go"
    "io/ioutil"
)

var privateKey []byte
var publicKey []byte 

func JSONWebTokensHandler(w http.ResponseWriter, r * http.Request){

    // Create the token
    encodeToken := jwt.New(jwt.SigningMethodHS256)
    // Set some claims
    encodeToken.Claims["Latitude"] = "25.000"
    encodeToken.Claims["Longitude"] = "27.000"
    // Sign and get the complete encoded token as a string
    tokenString, err := encodeToken.SignedString(privateKey)

    decodeToken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {

        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
        }

        return publicKey,nil
    })

    if decodeToken.Valid {

        fmt.Fprintf(w,"Lat:  %s, Lng: %s",decodeToken.Claims["Latitude"],decodeToken.Claims["Longitude"])

    }  else {

        fmt.Fprintf(w,"Couldn't handle this token: %s", err)

    }

}

func init(){

    privateKey,_ = ioutil.ReadFile("demo.rsa")
    publicKey,_ = ioutil.ReadFile("demo.rsa.pub")

    r := mux.NewRouter()
    r.HandleFunc("/jwt",JSONWebTokensHandler).Methods("GET")
    http.Handle("/", r)

}

现在,如果我的理解是正确的,那么可以使用公钥对使用私钥编码的 token 进行解码。这就是我在上面的代码中假定的,但是当我运行代码时出现错误:

Couldn't handle this token: signature is invalid

如果我使用相同的 key 进行编码和解码,那么代码就可以工作。

我想知道的是,是我的理解有问题还是代码有问题?

最佳答案

JWT 未使用 RSA 等非对称密码进行签名。它使用 HMAC ,它使用一个单一的 secret key 。事实上,这里的重点不是向其他人证明你签署了 token 。这是为了向自己证明你已经签署了它,从而禁止任何没有你的 key 的人修改 token 。

关于go - 与公钥和私钥以及 JWT 相关的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30952434/

相关文章:

Go Routines 有时有效,有时会出现关闭 channel 错误

Go版Stripe Checkout教程无法编译,未定义: session

api - 使用 Docker API for GO 时出现问题 - 无法导入 "nat"

sql - 有没有非常轻量级的数据库java库?

python编码/解码问题

google-cloud-platform - 无需 JWT token 即可连接到 Google IoT

javascript - Node API - 在处理任何请求之前执行 GET 请求

go - 如何设置EXE文件PE头中的 "file version"字段?

mysql - x-devapi 无法连接到 Google 应用程序引擎中的数据库

之前无法验证 JWT Token