在现代的网络应用中,安全性是至关重要的。为了保护用户数据和系统资源,访问令牌的验证是必不可少的一环。而Keycloak作为一款强大的身份认证和访问管理解决方案,为开发者提供了一种简单而安全的验证方式。本文将由php小编西瓜为大家介绍如何使用Keycloak进行访问令牌的验证,以保障应用的安全性。通过本文的指导,您将能够轻松地实现访问令牌的验证,并确保只有经过授权的用户才能访问您的应用。
我正在尝试使用 GO 实现访问令牌验证。但我在网上看到的例子似乎只是用 TOKEN_SECRET 来验证它。但是我习惯了在Java spring中编程,并且不需要使用TOKEN_SECRET。我只是提供 jwk-set-uri,它会检查有效性(自动 - 安全过滤器等),我知道它与 oauth 服务器通信并进行此验证。
Go 中是否没有库可以通过向 oauth 服务器发出请求来检查令牌是否有效?
我知道我知道我可以通过向 oauth 服务器的用户信息端点发出请求来手动进行此操作:
http://localhost:8080/auth/realms/<your_realm>/protocol/openid-connect/userinfo
(在带有密钥授权的标头中包含令牌)
但我不知道这是否完全符合标准。
正确的做法是什么?
简短回答:使用 go-oidc
长答案:
首先,让我们了解 Spring Security 如何自动验证 JWT 访问令牌。按照惯例,如果您在 application.yaml
配置文件中定义 OAuth 2.0 或 OIDC 客户端属性,Spring 将自动在安全过滤器链中连接一个过滤器,从 Keycloak 中获取 jwk-set
,Keycloak 是一组与密钥对应的公钥Keycloak 使用它来签署令牌。该过滤器将应用于所有受保护的路由,并且 spring 将使用公钥来检查令牌的签名是否有效,并在适用时进行其他检查(受众、超时等...)
那么我们如何在 Go 中做到这一点呢?我们可以编写一个简单的中间件来接受 jwk-set
并使用它来验证令牌。您需要检查 alg
声明以查看使用了哪种签名算法,从 jwk-set
中选择相应的公钥并检查签名是否有效。然后,解码令牌,确认 iss
和 sub
声明,以确保它来自受信任的颁发者并面向目标受众,并检查它是否尚未过期。检查 nbf
(不早于)和 iat
(发布于)声明的时间是否正确。最后,如果下游需要,将令牌中的相关信息注入到请求上下文中。
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) }) } }
以上是GO 验证访问令牌(keycloak)的详细内容。更多信息请关注PHP中文网其他相关文章!