GO-Zugriffstoken authentifizieren (Keycloak)

王林
Freigeben: 2024-02-09 09:30:24
nach vorne
736 Leute haben es durchsucht

GO 验证访问令牌(keycloak)

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.

Frageninhalt

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
Nach dem Login kopieren

(Token im Header mit Schlüsselautorisierung einschließen)

Aber ich weiß nicht, ob das völlig dem Standard entspricht.

Was ist der richtige Ansatz?

Workaround

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 中选择相应的公钥并检查签名是否有效。然后,解码令牌,确认 isssub 声明,以确保它来自受信任的颁发者并面向目标受众,并检查它是否尚未过期。检查 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)
        })
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!