我正在嘗試使用Go Web服務中的JWT(JSON Web令牌)。這是我到目前爲止已經完成:與公鑰和私鑰以及JWT有關的混淆
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)
}
現在,如果我的理解是正確的,即使用私有密鑰加密令牌可以使用公共密鑰解碼。這就是我在代碼中已經假設上述然而,當我運行代碼我得到的錯誤:
Couldn't handle this token: signature is invalid
如果我使用相同的密鑰編碼和解碼,然後代碼工作。
我想知道的是,我的理解或代碼中有什麼問題嗎?
正確,儘管RSA算法是JWT「標準」的一部分,並且包含在jwt-go包中。但是,我會強烈建議他們:HMAC構建從實現的角度來看更容易'正確',並且仍然提供所需的功能:防止第三方修改令牌。 – elithrar
@elithrar謝謝。我編輯答案來說「JWT」而不是「A」JWT。發佈的代碼使用HMAC。 –