Dalam era Internet hari ini, dengan populariti aplikasi Web, API (Antara Muka Pengaturcaraan Aplikasi, Antara Muka Pengaturcaraan Aplikasi) menjadi semakin prihatin dan dipercayai oleh pembangun. Dan melindungi keselamatan antara muka API adalah isu yang sangat penting. Artikel ini akan mengambil bahasa Go sebagai contoh untuk memperkenalkan cara menggunakan JWT (JSON Web Token) untuk melindungi keselamatan antara muka API.
1. Apakah itu JWT
Nama penuh JWT ialah JSON Web Token, yang merupakan standard terbuka (RFC 7519) yang digunakan untuk menghantar maklumat selamat antara pihak. JWT boleh mengesahkan, membenarkan dan bertukar maklumat. JWT biasanya digunakan untuk menghantar maklumat pengesahan dalam aplikasi web atau API.
Dalam JWT, ia terdiri daripada tiga bahagian: pengepala, muatan dan tandatangan.
Pengepala biasanya terdiri daripada dua bahagian: jenis token (iaitu JWT) dan nama algoritma (cth. HMAC SHA256 atau RSA).
{
"alg": "HS256",
"taip": "JWT"
}
Muatan mengandungi beberapa maklumat yang boleh dipercayai dan berguna, seperti ID pengguna atau hak akses. Tuntutan tersuai boleh ditambah pada muatan (adalah disyorkan untuk hanya menggunakan nama tuntutan berdaftar).
{
"sub": "1234567890",
"nama": "John Doe",
"iat": 1516239022
}
Untuk mengesahkan sama ada JWT adalah sahih dan sah, JWT perlu ditandatangani menggunakan kekunci dan algoritma yang dinyatakan dalam pengepala.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(muatan),
your-256-bit-rahsia
)
2. Gunakan JWT untuk melindungi antara muka API
Mula-mula anda perlu memasang pakej kebergantungan JWT bagi bahasa Go:
pergi dapatkan github .com/dgrijalva/ jwt-go
Apabila menggunakan JWT untuk melindungi antara muka API, anda perlu menjana dan mengesahkan JWT. Berikut ialah kod contoh mudah untuk menjana dan mengesahkan JWT:
Jana JWT
func GenerateToken(rentetan userid) (rentetan, ralat) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "userid": userid, "exp": time.Now().Add(time.Hour * 24 * 7).Unix(), //有效期一周 }) tokenString, err := token.SignedString([]byte("mysecretkey")) if err != nil { return "", err } return tokenString, nil
}
Sahkan JWT
func ValidateToken(rentetan tokenString) (bool, rentetan) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { return []byte("mysecretkey"), nil }) if err == nil && token.Valid { claims := token.Claims.(jwt.MapClaims) userid := claims["userid"].(string) //取出userid return true, userid } else { return false, "" }
}
Dalam antara muka API, anda perlu membaca JWT daripada permintaan HTTP terlebih dahulu dan mengesahkannya. Jika pengesahan lulus, akses kepada antara muka API dibenarkan, jika tidak, ralat 403 (tiada kebenaran) dikembalikan.
Berikut ialah contoh kod:
func myAPIHandler(w http.ResponseWriter, r *http.Request) {
tokenString := r.Header.Get("Authorization") //从HTTP请求中获取JWT if tokenString == "" { w.WriteHeader(http.StatusForbidden) return } tokenString = strings.TrimPrefix(tokenString, "Bearer ") ok, userid := ValidateToken(tokenString) //校验JWT if !ok { w.WriteHeader(http.StatusForbidden) return } // 对于登录用户,可以从JWT中获取用户信息(例如userid),并进行权限控制 // ... // 处理API请求 // ...
}
3. Ringkasan
Menggunakan JWT boleh melindungi keselamatan antara muka API dengan berkesan dan memastikan bahawa hanya pengguna yang dibenarkan boleh mengakses antara muka API. Dalam bahasa Go, menggunakan JWT juga sangat mudah Anda hanya perlu memasang pakej pergantungan dan menulis kod yang sepadan. Pada masa yang sama, untuk melindungi keselamatan antara muka API, langkah keselamatan lain juga diperlukan, seperti penyulitan HTTPS, tetapan firewall, pemantauan log, dsb.
Atas ialah kandungan terperinci Amalan pengaturcaraan pelayan bahasa: menggunakan JWT untuk melindungi antara muka API. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!