golang melaksanakan jwt
Dalam pembangunan aplikasi Internet hari ini, keselamatan semakin mendapat perhatian. Token Web JSON (JWT) telah menjadi salah satu daripada skim pengesahan dan kebenaran biasa dalam kebanyakan reka bentuk API web. JWT ialah standard terbuka (RFC 7519) yang mentakrifkan cara yang padat dan serba lengkap untuk menyampaikan maklumat dengan selamat antara pihak.
Bahasa Go ialah bahasa pengaturcaraan bahagian pelayan yang sangat berkuasa, dan sangat mudah untuk melaksanakan JWT dengan mudah. Dalam artikel ini, kami akan memperkenalkan cara melaksanakan JWT di Golang.
1. Perkenalkan kebergantungan
Pertama, anda perlu memperkenalkan perpustakaan berikut:
import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/base64" "encoding/pem" "errors" "fmt" "time" "github.com/dgrijalva/jwt-go" )
- crypto/rsa: Mengandungi fungsi untuk menjana dan menghurai RSA awam dan peribadi kunci .
- crypto/x509: Mengandungi fungsi sijil dalam format PKIX
- pengekodan/base64: digunakan untuk mengekod dan menyahkod bahagian JWT
- pengekodan/pem: digunakan untuk mengekstrak dan Menyimpan sijil dalam format PEM
- ralat: digunakan untuk mengendalikan maklumat ralat yang dikembalikan
- fmt: fungsi pemformatan standard
- masa: fungsi masa standard
- github .com/ dgrijalva/jwt-go: Kebergantungan utama JWT
2. Cipta fail kunci
Pertama, anda perlu mencipta fail kunci peribadi. Gunakan arahan berikut untuk menjana fail kunci peribadi:
openssl genrsa -out app.rsa 1024
Ini akan menjana kunci RSA 1024-bit bernama app.rsa
. Kami akan menggunakan kunci ini untuk menjana JWT.
- Jana Token JWT
Sekarang, kita boleh mencipta token JWT menggunakan kod berikut:
func GenerateJWT() (string, error) { token := jwt.New(jwt.SigningMethodHS256) claims := token.Claims.(jwt.MapClaims) claims["authorized"] = true claims["user"] = "user@example.com" claims["exp"] = time.Now().Add(time.Hour * 1).Unix() tokenString, err := token.SignedString([]byte("secret")) if err != nil { return "", err } return tokenString, nil }
Fungsi ini mencipta token JWT menggunakan HS256 algoritma . Pertama, kami mencipta objek token JWT baharu. Kami kemudian menambah kenyataan itu kepada tuntutannya. Dalam contoh ini, kami mengisytiharkan bahawa "Kebenaran" ditetapkan kepada "Benar", pengguna ditetapkan kepada "pengguna@example.com", dan masa tamat tempoh JWT ditetapkan kepada 1 jam kemudian. Akhir sekali, kami menandatangani JWT menggunakan "rahsia" yang disediakan ("rahsia" dalam contoh ini) dan mengembalikan rentetan itu.
- Menghuraikan token JWT
Kita boleh menggunakan kod berikut untuk menghuraikan token JWT:
func ParseJWT(tokenString string) (jwt.MapClaims, error) { 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"), nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") }
Fungsi ini menerima rentetan token JWT dan kemudian Cuba menghuraikan JWT. Di sini kami menggunakan algoritma HS256 untuk menyahsulit jwt. Pertama, kita perlu mengesahkan sama ada Token ditandatangani menggunakan algoritma HMAC, jika tidak ralat akan dikembalikan. Seterusnya, kami mengembalikan kunci penyulitan ("rahsia" dalam contoh ini). Apabila penghuraian berjaya, fungsi mengembalikan tuntutan yang disahkan dan belum tamat tempoh. Jika penghuraian gagal, fungsi mengembalikan mesej ralat.
- Kaedah penyulitan yang lebih maju
Selain algoritma HS256, terdapat banyak algoritma penyulitan lain yang boleh anda gunakan untuk menyulitkan muatan JWT. Sebagai contoh, JWT yang ditandatangani menggunakan algoritma RSA adalah lebih selamat daripada menggunakan algoritma HS256. Berikut ialah cara untuk menjana token JWT menggunakan algoritma RSA:
func GenerateJWT() (string, error) { privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { return "", err } token := jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims{ "authorized": true, "user": "user@example.com", "exp": time.Now().Add(time.Hour * 1).Unix(), }) tokenString, err := token.SignedString(privateKey) if err != nil { return "", err } return tokenString, nil }
Di sini, kami mula-mula menjana kunci peribadi RSA 2048-bit. Kami kemudian menandatangani token JWT menggunakan algoritma RS256. Akhir sekali, kami menandatangani token JWT menggunakan kunci persendirian.
Pendekatan berbeza juga diperlukan semasa menghuraikan token JWT:
func ParseJWT(tokenString string) (jwt.MapClaims, error) { publicKey := ` -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArtpZKxF+1MDwcJ61KeJt GjHYiAL46jEewsjF9oBz59J2y5/v/tE/RQjJjOtGvLQ5LfPYBK+j+Z6QIwU1ZzCJ I0MT5mn81znZCsy7zcZI7+kRPG8Fk5JzKM2ug7RAuYqnOjArL8+V+uS4Moh2RWdN yZizvjajzKtbH5zLC49Dd3X/SrjzPQpzt8HY4Z7YxYej8/Akl3nxdx9Q/OPG2NYP xtflmpLLJc7roqkfVwwMQeC1apHr/klI3FHPvK/pzBoUCUOpTfnyvHg8O1+PyMKJ CldHEhuzUsTR5jM5fXv0M4+vL36QO8k1WhO4gcQTD6X7fIWqFhfrRM/jreG+bv8c 7wIDAQAB -----END PUBLIC KEY----- ` block, _ := pem.Decode([]byte(publicKey)) if block == nil { return nil, errors.New("failed to decode PEM block containing public key") } pub, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { return nil, err } token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return pub, nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") }
Dalam fungsi ini kita perlu mengekstrak kunci awam RSA dahulu dan kemudian menghantarnya ke fungsi jwt.Parse. Apabila menghuraikan token, perpustakaan jwt-go secara automatik akan menggunakan kunci awam untuk pengesahan. Ambil perhatian bahawa kunci awam yang digunakan di sini disediakan dalam format PKIX. Anda boleh menggunakan alat seperti OpenSSL untuk mengeksport kunci awam PEM kepada format PKIX.
6. Ringkasan
Dalam artikel ini, kami memperkenalkan cara mencipta dan menghuraikan token JWT di Golang menggunakan algoritma HS256 dan RS256. Ini ialah skim pengesahan dan kebenaran biasa yang boleh anda gunakan dalam aplikasi web masa hadapan. Semoga artikel ini bermanfaat kepada anda.
Atas ialah kandungan terperinci golang melaksanakan jwt. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





OpenSSL, sebagai perpustakaan sumber terbuka yang digunakan secara meluas dalam komunikasi yang selamat, menyediakan algoritma penyulitan, kunci dan fungsi pengurusan sijil. Walau bagaimanapun, terdapat beberapa kelemahan keselamatan yang diketahui dalam versi sejarahnya, yang sebahagiannya sangat berbahaya. Artikel ini akan memberi tumpuan kepada kelemahan umum dan langkah -langkah tindak balas untuk OpenSSL dalam sistem Debian. Debianopenssl yang dikenal pasti: OpenSSL telah mengalami beberapa kelemahan yang serius, seperti: Kerentanan Pendarahan Jantung (CVE-2014-0160): Kelemahan ini mempengaruhi OpenSSL 1.0.1 hingga 1.0.1f dan 1.0.2 hingga 1.0.2 versi beta. Penyerang boleh menggunakan kelemahan ini untuk maklumat sensitif baca yang tidak dibenarkan di pelayan, termasuk kunci penyulitan, dll.

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Laluan Pembelajaran Backend: Perjalanan Eksplorasi dari Front-End ke Back-End sebagai pemula back-end yang berubah dari pembangunan front-end, anda sudah mempunyai asas Nodejs, ...

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Artikel ini memperkenalkan pelbagai kaedah dan alat untuk memantau pangkalan data PostgreSQL di bawah sistem Debian, membantu anda memahami pemantauan prestasi pangkalan data sepenuhnya. 1. Gunakan PostgreSQL untuk membina pemantauan PostgreSQL sendiri menyediakan pelbagai pandangan untuk pemantauan aktiviti pangkalan data: PG_STAT_ACTIVITY: Memaparkan aktiviti pangkalan data dalam masa nyata, termasuk sambungan, pertanyaan, urus niaga dan maklumat lain. PG_STAT_REPLITI: Memantau status replikasi, terutamanya sesuai untuk kluster replikasi aliran. PG_STAT_DATABASE: Menyediakan statistik pangkalan data, seperti saiz pangkalan data, masa komitmen/masa rollback transaksi dan petunjuk utama lain. 2. Gunakan alat analisis log pgbadg

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...
