editor php Xigua memperkenalkan anda kepada masalah biasa: Tidak dapat mengesahkan token JWT. JWT (JSON Web Token) ialah standard terbuka untuk pengesahan dan kebenaran. Walau bagaimanapun, kadangkala dalam aplikasi PHP, kami mungkin menghadapi masalah kerana tidak dapat mengesahkan token JWT. Ini mungkin disebabkan oleh beberapa sebab, seperti ketidakpadanan kunci, token tamat tempoh, dsb. Artikel ini akan menerangkan kemungkinan punca masalah ini secara terperinci dan menyediakan penyelesaian untuk membantu anda berjaya mengesahkan token JWT.
Apa yang saya mahu lakukan ialah menjana kunci baharu, mencipta token jwt, dan kemudian mengesahkannya.
package main import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/x509" "encoding/base64" "fmt" "log" "time" "github.com/golang-jwt/jwt/v4" ) func main() { key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { log.Fatalln(err) return } privateK, err := x509.MarshalECPrivateKey(key) if err != nil { log.Fatalln(err) return } claims := jwt.MapClaims{} claims["authorized"] = true claims["user_id"] = 10 claims["exp"] = time.Now().Add(time.Hour * time.Duration(1)).Unix() t := jwt.NewWithClaims(jwt.SigningMethodES256, claims) tokenStr, err := t.SignedString(key) if err != nil { log.Fatalln(err) return } fmt.Printf("Secret: %s\n", base64.StdEncoding.EncodeToString(privateK)) fmt.Printf("Token: %s\n", tokenStr) // Validate token _, err = jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodECDSA); !ok { return nil, fmt.Errorf("unexpected signing method %v", token.Header["alg"]) } return key, nil }) if err != nil { log.Fatalf("Token is invalid %v", err) } else { fmt.Println("Token is valid") } }
Saya dapat token is invalid: key is of invalid type
. Apa yang saya buat salah?
Mengikut Dokumentasi
Kaedah tandatangan ECDSA (ES256, ES384, ES512) memerlukan *ecdsa.PrivateKey untuk menandatangani dan *ecdsa.PublicKey untuk pengesahan
keyfunc
keyfunc
返回一个 * edcsa.PrivateKey
与上面的不匹配。要修复此问题,请将 return key, nil
更改为 return &key.PublicKey, nil
anda mengembalikan * edcsa.PrivateKey
yang tidak sepadan dengan di atas. Untuk membetulkan perkara ini, tukar kunci pulang, tiada
kepada
Atas ialah kandungan terperinci Tidak dapat mengesahkan token JWT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!