Rumah  >  Artikel  >  pembangunan bahagian belakang  >  GO sahkan token akses (kunci kunci)

GO sahkan token akses (kunci kunci)

王林
王林ke hadapan
2024-02-09 09:30:24736semak imbas

GO 验证访问令牌(keycloak)

Dalam aplikasi rangkaian moden, keselamatan adalah penting. Untuk melindungi data pengguna dan sumber sistem, pengesahan token akses ialah langkah penting. Sebagai penyelesaian pengesahan identiti dan pengurusan akses yang berkuasa, Keycloak menyediakan pembangun kaedah pengesahan yang mudah dan selamat. Dalam artikel ini, editor PHP Xigua akan memperkenalkan cara menggunakan Keycloak untuk mengesahkan token akses untuk memastikan keselamatan aplikasi. Dengan panduan artikel ini, anda akan dapat melaksanakan pengesahan token akses dengan mudah dan memastikan bahawa hanya pengguna yang dibenarkan boleh mengakses aplikasi anda.

Kandungan soalan

Saya cuba melaksanakan pengesahan token akses menggunakan GO. Tetapi contoh yang saya lihat dalam talian nampaknya hanya menggunakan TOKEN_SECRET untuk mengesahkannya. Tetapi saya sudah biasa dengan pengaturcaraan dalam Java spring dan tidak perlu menggunakan TOKEN_SECRET. Saya hanya menyediakan jwk-set-uri dan ia menyemak kesahihan (auto - penapis keselamatan dll) dan saya tahu ia bercakap dengan pelayan oauth dan melakukan pengesahan ini.

Adakah tiada perpustakaan dalam Go yang boleh menyemak sama ada token itu sah dengan membuat permintaan kepada pelayan oauth?

Saya tahu saya boleh melakukan ini secara manual dengan membuat permintaan ke titik akhir info pengguna pelayan oauth:

http://localhost:8080/auth/realms/<your_realm>/protocol/openid-connect/userinfo

(sertakan token dalam pengepala dengan kebenaran kunci)

Tetapi saya tidak tahu sama ada ini memenuhi kriteria sepenuhnya.

Apakah pendekatan yang betul?

Penyelesaian

Jawapan ringkas: Gunakan go-oidc

Jawapan panjang: Mula-mula, mari kita fahami cara Spring Security mengesahkan token akses JWT secara automatik. Mengikut konvensyen, jika anda berada di application.yaml 配置文件中定义 OAuth 2.0 或 OIDC 客户端属性,Spring 将自动在安全过滤器链中连接一个过滤器,从 Keycloak 中获取 jwk-set, Keycloak ialah satu set kunci awam yang sepadan dengan kunci yang digunakan Keycloak untuk menandatangani token. Penapis akan digunakan pada semua laluan yang dilindungi dan musim bunga akan menggunakan kunci awam untuk menyemak sama ada tandatangan token itu sah dan melakukan semakan lain jika berkenaan (khalayak, tamat masa, dll...)

Jadi bagaimana kita melakukan ini dalam Go? Kita boleh menulis middleware mudah yang menerima sama ada masa pernyataan jwk-set 并使用它来验证令牌。您需要检查 alg 声明以查看使用了哪种签名算法,从 jwk-set 中选择相应的公钥并检查签名是否有效。然后,解码令牌,确认 isssub 声明,以确保它来自受信任的颁发者并面向目标受众,并检查它是否尚未过期。检查 nbf (不早于)和 iat (diterbitkan pada) adalah betul. Akhir sekali, maklumat berkaitan daripada token disuntik ke dalam konteks permintaan jika diperlukan di hiliran.

func JWTMiddleware(jwkSet map[string]*rsa.PublicKey) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            authHeader := r.Header.Get("Authorization")
            if authHeader == "" {
                http.Error(w, "Authorization header is required", http.StatusUnauthorized)
                return
            }

            tokenString := strings.TrimPrefix(authHeader, "Bearer ")
            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"])
                }

                alg := token.Method.Alg()
                publicKey, ok := jwkSet[alg]
                if !ok {
                    return nil, fmt.Errorf("no key found for signing method: %v", alg)
                }
                return publicKey, nil
            })
            
            if err != nil || !token.Valid {
                http.Error(w, "Invalid token", http.StatusUnauthorized)
                return
            }
            // Other checks, ISS, Aud, Expirey, etc ...
            // If needed, store the user principal 
            // and other relevant info the request context  
            next.ServeHTTP(w, r)
        })
    }
}

Atas ialah kandungan terperinci GO sahkan token akses (kunci kunci). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Baca csv ke dalam baitArtikel seterusnya:Baca csv ke dalam bait