Tidak dapat mengesahkan token JWT

WBOY
Lepaskan: 2024-02-09 08:00:21
ke hadapan
571 orang telah melayarinya

无法验证 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")
    }
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan