In modernen Netzwerkanwendungen ist Sicherheit von entscheidender Bedeutung. Um Benutzerdaten und Systemressourcen zu schützen, ist die Überprüfung von Zugriffstokens ein wesentlicher Schritt. Als leistungsstarke Lösung zur Identitätsauthentifizierung und Zugriffsverwaltung bietet Keycloak Entwicklern eine einfache und sichere Verifizierungsmethode. In diesem Artikel stellt der PHP-Editor Xigua vor, wie man Keycloak zur Überprüfung von Zugriffstokens verwendet, um die Anwendungssicherheit zu gewährleisten. Mit der Anleitung dieses Artikels können Sie die Überprüfung des Zugriffstokens einfach implementieren und sicherstellen, dass nur autorisierte Benutzer auf Ihre Anwendung zugreifen können.
Ich versuche, die Zugriffstoken-Verifizierung mit GO zu implementieren. Aber die Beispiele, die ich online gesehen habe, scheinen nur TOKEN_SECRET zu verwenden, um es zu validieren. Aber ich bin es gewohnt, in Java Spring zu programmieren und muss TOKEN_SECRET nicht verwenden. Ich stelle einfach die jwk-set-uri zur Verfügung und sie prüft auf Gültigkeit (automatische Sicherheitsfilter usw.) und ich weiß, dass sie mit dem OAuth-Server kommuniziert und diese Validierung durchführt.
Gibt es in Go keine Bibliothek, die durch eine Anfrage an den OAuth-Server prüfen kann, ob das Token gültig ist?
Ich weiß, dass ich dies manuell tun kann, indem ich eine Anfrage an den Benutzerinfo-Endpunkt des OAuth-Servers stelle:
http://localhost:8080/auth/realms/<your_realm>/protocol/openid-connect/userinfo
(Token im Header mit Schlüsselautorisierung einschließen)
Aber ich weiß nicht, ob das völlig dem Standard entspricht.
Was ist der richtige Ansatz?
Kurze Antwort: Verwenden Sie go-oidc
Lange Antwort:
Lassen Sie uns zunächst verstehen, wie Spring Security JWT-Zugriffstoken automatisch validiert. Wenn Sie sich in application.yaml
配置文件中定义 OAuth 2.0 或 OIDC 客户端属性,Spring 将自动在安全过滤器链中连接一个过滤器,从 Keycloak 中获取 jwk-set
befinden, handelt es sich bei Keycloak vereinbarungsgemäß um einen Satz öffentlicher Schlüssel, die den Schlüsseln entsprechen, die Keycloak zum Signieren von Token verwendet. Der Filter wird auf alle geschützten Routen angewendet und Spring verwendet den öffentlichen Schlüssel, um zu prüfen, ob die Signatur des Tokens gültig ist, und führt gegebenenfalls weitere Prüfungen durch (Zielgruppe, Zeitüberschreitung usw.)
Wie machen wir das also in Go? Wir können eine einfache Middleware schreiben, die akzeptiert, ob der Zeitpunkt der jwk-set
并使用它来验证令牌。您需要检查 alg
声明以查看使用了哪种签名算法,从 jwk-set
中选择相应的公钥并检查签名是否有效。然后,解码令牌,确认 iss
和 sub
声明,以确保它来自受信任的颁发者并面向目标受众,并检查它是否尚未过期。检查 nbf
(不早于)和 iat
(veröffentlicht am)-Anweisung korrekt ist. Schließlich werden relevante Informationen aus dem Token bei Bedarf in den Anforderungskontext eingefügt.
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) }) } }
Das obige ist der detaillierte Inhalt vonGO-Zugriffstoken authentifizieren (Keycloak). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!