Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tidak dapat mengesahkan token JWT

Tidak dapat mengesahkan token JWT

WBOY
WBOYke hadapan
2024-02-09 08:00:21567semak imbas

无法验证 JWT 令牌

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.

Kandungan soalan

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?

Penyelesaian

Mengikut Dokumentasi

Kaedah tandatangan ECDSA (ES256, ES384, ES512) memerlukan *ecdsa.PrivateKey untuk menandatangani dan *ecdsa.PublicKey untuk pengesahan

keyfunckeyfunc 返回一个 * 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 kunci &kunci.PublicKey, tiada (taman permainan).

Atas ialah kandungan terperinci Tidak dapat mengesahkan token JWT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam