Maison > développement back-end > Golang > le corps du texte

GO authentifier le jeton d'accès (keycloak)

王林
Libérer: 2024-02-09 09:30:24
avant
736 Les gens l'ont consulté

GO 验证访问令牌(keycloak)

Dans les applications réseau modernes, la sécurité est cruciale. Afin de protéger les données des utilisateurs et les ressources système, la vérification des jetons d'accès est une étape essentielle. En tant que puissante solution d'authentification des identités et de gestion des accès, Keycloak offre aux développeurs une méthode de vérification simple et sécurisée. Dans cet article, l'éditeur PHP Xigua présentera comment utiliser Keycloak pour vérifier les jetons d'accès afin de garantir la sécurité des applications. Grâce aux conseils de cet article, vous pourrez facilement mettre en œuvre la vérification des jetons d'accès et vous assurer que seuls les utilisateurs autorisés peuvent accéder à votre application.

Contenu de la question

J'essaie d'implémenter la vérification du jeton d'accès à l'aide de GO. Mais les exemples que j'ai vus en ligne semblent simplement utiliser TOKEN_SECRET pour le valider. Mais je suis habitué à programmer en Java Spring et je n'ai pas besoin d'utiliser TOKEN_SECRET. Je fournis simplement le jwk-set-uri et il vérifie la validité (filtres de sécurité automatique, etc.) et je sais qu'il parle au serveur oauth et effectue cette validation.

N'y a-t-il pas de bibliothèque dans Go qui puisse vérifier si le token est valide en faisant une requête au serveur oauth ?

Je sais que je peux le faire manuellement en faisant une requête au point de terminaison userinfo du serveur oauth :

http://localhost:8080/auth/realms/<your_realm>/protocol/openid-connect/userinfo
Copier après la connexion

(inclure le jeton dans l'en-tête avec l'autorisation de clé)

Mais je ne sais pas si c’est tout à fait aux normes.

Quelle est la bonne approche ?

Solution de contournement

Réponse courte : utilisez go-oidc

Réponse longue : Tout d'abord, comprenons comment Spring Security valide automatiquement les jetons d'accès JWT. Par convention, si vous êtes en application.yaml 配置文件中定义 OAuth 2.0 或 OIDC 客户端属性,Spring 将自动在安全过滤器链中连接一个过滤器,从 Keycloak 中获取 jwk-set, Keycloak est un ensemble de clés publiques qui correspondent aux clés que Keycloak utilise pour signer les tokens. Le filtre sera appliqué à toutes les routes protégées et spring utilisera la clé publique pour vérifier que la signature du token est valide et effectuer d'autres vérifications le cas échéant (audience, timeout, etc...)

Alors, comment fait-on cela dans Go ? Nous pouvons écrire un middleware simple qui accepte si l'heure de l'instruction jwk-set 并使用它来验证令牌。您需要检查 alg 声明以查看使用了哪种签名算法,从 jwk-set 中选择相应的公钥并检查签名是否有效。然后,解码令牌,确认 isssub 声明,以确保它来自受信任的颁发者并面向目标受众,并检查它是否尚未过期。检查 nbf (不早于)和 iat (publiée le) est correcte. Enfin, les informations pertinentes du jeton sont injectées dans le contexte de la demande si nécessaire en aval.

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)
        })
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!