Rumah > pembangunan bahagian belakang > Golang > Token JWT di Golang: Panduan Pembangun untuk Selamatkan API

Token JWT di Golang: Panduan Pembangun untuk Selamatkan API

Mary-Kate Olsen
Lepaskan: 2025-01-14 20:06:47
asal
265 orang telah melayarinya

JWT Tokens in Golang: A Developer’s Guide to Secure APIs

Pengenalan

Dalam pembangunan web moden, pengesahan yang selamat dan berskala adalah penting. Token Web JSON (JWT) telah menjadi cara standard untuk mencapai matlamat ini. Dalam catatan blog ini, kami akan meneroka apa itu JWT, cara ia berfungsi dan cara melaksanakannya di Golang.

Apakah itu JWT?

JSON Web Token (JWT) ialah cara padat, selamat URL untuk mewakili tuntutan untuk menghantar tuntutan dengan selamat antara dua pihak. Ia biasanya digunakan untuk mengesahkan dan membenarkan pengguna dalam API dan sistem teragih.

Struktur JWT

JWT terdiri daripada tiga bahagian yang dipisahkan oleh titik (.):

<code>Header.Payload.Signature</code>
Salin selepas log masuk

Contoh:

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.reGQzG3OKdoIMWLDKOZ4TICJit3EW69cQE72E2CfzRE</code>
Salin selepas log masuk

Setiap bahagian ialah:

  1. Tajuk: Menentukan jenis token (JWT) dan algoritma tandatangan (HS256).
<code>{
  "alg": "HS256",
  "typ": "JWT"
}</code>
Salin selepas log masuk
  1. Muat bayar: Mengandungi tuntutan (data pengguna seperti ID, peranan atau nama).
<code>{
    "sub": "1234567890",
    "name": "John Doe",
    "admin": true,
    "iat": 1516239022
}</code>
Salin selepas log masuk
  1. Tandatangan: Menggunakan proses tandatangan kriptografi untuk memastikan integriti token. Mari kita terokai ini secara terperinci.

Cara membuat tandatangan:

  • Sambungkan Pengepala dan Muatan yang dikodkan:
<code>  base64UrlEncode(header) + "." + base64UrlEncode(payload)</code>
Salin selepas log masuk
  • Tandatangan keputusan:
    • Gunakan algoritma tandatangan kriptografi (cth., HMACSHA256, RS256) menggunakan kunci rahsia atau kunci peribadi.
  • Tandatangan tambahan: JWT akhir menjadi
<code>  header.payload.signature</code>
Salin selepas log masuk

Cara JWT berfungsi

  1. Pelanggan menghantar bukti kelayakan log masuk ke pelayan.
  2. Jika sah, pelayan akan menjana JWT dan mengembalikannya kepada pelanggan.
  3. Pelanggan menyimpan JWT (cth. dalam localStorage atau kuki).
  4. Untuk setiap permintaan, pelanggan memasukkan JWT dalam pengepala Kebenaran: Kebenaran: Pembawa
  5. Pelayan mengesahkan JWT pada setiap permintaan.
    • Kira semula tandatangan menggunakan Pengepala dan Muatan yang diterima.
    • Bandingkan tandatangan yang dikira semula dengan tandatangan yang diterima.

Melaksanakan JWT di Golang

Pemaju Golang boleh memanfaatkan perpustakaan golang-jwt/jwt yang sangat baik untuk mengendalikan JWT. Pustaka ini menyediakan fungsi yang berkuasa untuk mencipta, menandatangani dan mengesahkan JWT. Anda boleh mendapatkannya di sini.

Walau bagaimanapun, mengurus JWT selalunya memerlukan tugas berulang seperti mengkonfigurasi kaedah menandatangani, menghuraikan token dan mengesahkan tuntutan. Untuk memudahkan ini, saya menulis pakej tersuai untuk membungkus fungsi golang-jwt. Anda boleh melihat pakej saya di sini. Berikut ialah contoh cara menggunakan pakej JWT tersuai saya.

<code class="language-go">package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/golang-jwt/jwt/v5"
    jwtutil "github.com/kittipat1413/go-common/util/jwt"
)

type MyCustomClaims struct {
    jwt.RegisteredClaims
    UserID string `json:"uid"`
}

func main() {
    ctx := context.Background()
    signingKey := []byte("super-secret-key")
    manager, err := jwtutil.NewJWTManager(jwtutil.HS256, signingKey)
    if err != nil {
        log.Fatalf("Failed to create JWTManager: %v", err)
    }

    // Prepare custom claims
    claims := &MyCustomClaims{
        RegisteredClaims: jwt.RegisteredClaims{
            ExpiresAt: jwt.NewNumericDate(time.Now().Add(15 * time.Minute)),
            Issuer:    "example-HS256",
            Subject:   "example-subject",
        },
        UserID: "abc123",
    }

    // Create the token
    tokenStringHS256, err := manager.CreateToken(ctx, claims)
    if err != nil {
        log.Fatalf("Failed to create token: %v", err)
    }
    fmt.Println("Generated Token:", tokenStringHS256)

    // Validate the token
    parsedClaims := &MyCustomClaims{}
    err = manager.ParseAndValidateToken(ctx, tokenStringHS256, parsedClaims)
    if err != nil {
        log.Fatalf("Failed to validate token: %v", err)
    }

    fmt.Printf("Token is valid! UserID: %s, Issuer: %s\n", parsedClaims.UserID, parsedClaims.Issuer)
}</code>
Salin selepas log masuk
Anda boleh menyemak imbas pelaksanaan penuh dan dokumentasi pakej saya di GitHub: di sini.

Amalan Terbaik JWT

  1. Gunakan HTTPS: Sentiasa pindahkan token melalui saluran selamat.
  2. Tetapkan masa tamat tempoh: Sertakan exp yang munasabah untuk mengehadkan penyalahgunaan token.
  3. Lindungi kunci anda: Simpan kunci anda dengan selamat menggunakan pembolehubah persekitaran atau pengurus kunci.
  4. Elakkan menggunakan data sensitif dalam muatan: Sertakan hanya maklumat tidak kritikal.
  5. Gunakan token muat semula: Gandingkan JWT dengan token muat semula untuk melanjutkan sesi dengan selamat.

Kesimpulan ?

JWT ialah alat yang berkuasa untuk pengesahan yang selamat dan tanpa kewarganegaraan. Tandatangan itu memastikan integriti dan ketulenan token, menjadikan JWT sesuai untuk API dan sistem teragih. Menggunakan perpustakaan seperti jwt-go anda boleh melaksanakan JWT dengan mudah dalam projek Golang anda.

☕ Sokong kerja saya ☕

Jika anda suka kerja saya, sila pertimbangkan untuk membeli saya kopi! Sokongan anda membantu saya terus mencipta kandungan berharga dan berkongsi pengetahuan. ☕

Atas ialah kandungan terperinci Token JWT di Golang: Panduan Pembangun untuk Selamatkan API. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan