Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan JWT dalam bahasa Go untuk melaksanakan pengesahan pengguna yang mudah dan selamat

Gunakan JWT dalam bahasa Go untuk melaksanakan pengesahan pengguna yang mudah dan selamat

王林
王林asal
2023-06-15 18:52:081752semak imbas

Dengan perkembangan pesat teknologi rangkaian, semakin banyak laman web dan aplikasi perlu melaksanakan fungsi pengesahan pengguna. Walau bagaimanapun, kaedah pengesahan nama pengguna dan kata laluan tradisional mempunyai risiko keselamatan kerana ia biasanya disimpan dalam pangkalan data Setelah pangkalan data diserang, maklumat pengguna akan dibocorkan. Untuk menyelesaikan masalah ini, JWT (JSON Web Token) wujud. JWT ialah standard terbuka (RFC 7519) yang mentakrifkan cara ringkas dan serba lengkap untuk menghantar maklumat yang boleh disahkan dan dipercayai. Artikel ini akan memperkenalkan cara menggunakan JWT dalam bahasa Go untuk melaksanakan pengesahan pengguna yang mudah dan selamat.

Cara JWT berfungsi

Sebelum memperkenalkan cara menggunakan JWT dalam bahasa Go, mari kita fahami dahulu cara JWT berfungsi. JWT terdiri daripada tiga bahagian:

  • Tajuk: Bahagian ini mengandungi jenis token dan maklumat algoritma, biasanya menggunakan penyulitan SHA256.
  • Muatan: Bahagian ini menyimpan maklumat yang akan dihantar, seperti nama pengguna, kebenaran, dsb., dan juga boleh mengandungi beberapa medan tersuai.
  • Tandatangan: Bahagian ini ialah tandatangan yang dijana dengan menyulitkan rentetan yang terdiri daripada Pengepala dan Muatan.

Token yang dijana JWT boleh dihantar melalui pengepala HTTP atau parameter URL. Apabila pelanggan meminta pelayan, pelayan akan menyemak token JWT dalam pengepala permintaan atau parameter URL Jika token itu sah, ia akan mengembalikan data yang diminta oleh klien. Jika token tidak sah, mesej ralat dikembalikan.

Dalam aplikasi sebenar, pelayan harus menetapkan tempoh sah apabila menjana JWT Selepas tamat tempoh, pelanggan perlu mendapatkan semula token JWT baharu.

Menggunakan JWT dalam bahasa Go

Dalam bahasa Go, fungsi JWT boleh dilaksanakan dengan cepat dan mudah dengan menggunakan perpustakaan pihak ketiga. Artikel ini mengesyorkan menggunakan perpustakaan jwt-go, yang menyokong penjanaan dan pengesahan JWT dan mempunyai kelebihan keselamatan jenis dan prestasi tinggi.

Pasang perpustakaan jwt-go

Masukkan arahan berikut dalam terminal Anda boleh menggunakan arahan go get untuk memasang perpustakaan jwt-go.

go get github.com/dgrijalva/jwt-go

Jana JWT

Dalam bahasa Go, penjanaan JWT boleh dicapai melalui kod berikut:

package main

import (
    "fmt"
    "time"
    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 创建JWT头信息
    token := jwt.New(jwt.SigningMethodHS256)
    // 设置有效期
    token.Claims = jwt.MapClaims{
        "exp": time.Now().Add(time.Hour * 72).Unix(),
        "iat": time.Now().Unix(),
        "sub": "1234567890",
    }
    // 对生成的JWT令牌进行签名
    signedToken, err := token.SignedString([]byte("secret-key"))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(signedToken)
}

Dalam kod, gunakan fungsi jwt.New() untuk mencipta maklumat pengepala JWT , tetapkan tempoh sah dan maklumat yang dihantar (dalam contoh, medan bernama sub dihantar), dan kemudian gunakan fungsi SignedString() untuk menandatangani token JWT.

Sahkan JWT

Dalam bahasa Go, pengesahan JWT boleh dilaksanakan menggunakan kod berikut:

package main

import (
    "fmt"
    "time"
    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 待验证的JWT令牌
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTAzMDAzMTAsImlhdCI6MTYxMDgwNTExMCwic3ViIjoiMTIzNDU2Nzg5MCJ9.5AtrChvChVuWI3TkazGt1mDhbscT8-Qal5U6Qc4dqhc"
    // 解析JWT头信息
    token, 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 []byte("secret-key"), nil
    })
    if err != nil {
        fmt.Println(err)
        return
    }
    // 验证JWT有效期
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        expirationTime := time.Unix(int64(claims["exp"].(float64)), 0)
        if expirationTime.Before(time.Now()) {
            fmt.Println("JWT has expired")
        } else {
            fmt.Println("JWT is valid")
        }
    } else {
        fmt.Println("JWT is not valid")
    }
}

Dalam kod, gunakan fungsi jwt.Parse() untuk menghuraikan JWT untuk disahkan Token kemudiannya disahkan menggunakan kunci tandatangan yang diluluskan. Semasa pengesahan, mula-mula gunakan fungsi Claims() untuk mendapatkan masa sah dalam JWT, dan kemudian bandingkan dengan masa semasa Jika token telah tamat tempoh, mesej ralat dikembalikan.

Ringkasan

Sebagai kaedah pengesahan yang selamat dan mudah, JWT digunakan secara meluas dalam pembangunan web. Artikel ini memperkenalkan cara menggunakan perpustakaan jwt-go dalam bahasa Go untuk melaksanakan fungsi JWT dengan cepat dan ringkas. JWT boleh digunakan bukan sahaja untuk pengesahan pengguna, tetapi juga untuk penghantaran data, pengesahan API dan senario lain. Dalam aplikasi praktikal, kita harus memberi perhatian kepada tempoh sah JWT dan perlindungan keselamatan kunci tandatangan.

Atas ialah kandungan terperinci Gunakan JWT dalam bahasa Go untuk melaksanakan pengesahan pengguna yang mudah dan selamat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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