目录
问题内容
解决方法
首页 后端开发 Golang GO 验证访问令牌(keycloak)

GO 验证访问令牌(keycloak)

Feb 09, 2024 am 09:30 AM
spring security

GO 验证访问令牌(keycloak)

在现代的网络应用中,安全性是至关重要的。为了保护用户数据和系统资源,访问令牌的验证是必不可少的一环。而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 中选择相应的公钥并检查签名是否有效。然后,解码令牌,确认 isssub 声明,以确保它来自受信任的颁发者并面向目标受众,并检查它是否尚未过期。检查 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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Spring Security 6:cors() 已弃用并标记为删除 Spring Security 6:cors() 已弃用并标记为删除 Feb 10, 2024 pm 11:45 PM

我有下面的代码:publicSecurityFilterChainsecurityFilterChain(HttpSecurityhttp)throwsException{returnhttp.httpBasic().disable().cors().and().csrf().disable().authorizeHttpRequests().requestMatchers("

如何使用Java开发一个基于Spring Security SAML的单点登录系统 如何使用Java开发一个基于Spring Security SAML的单点登录系统 Sep 22, 2023 am 08:49 AM

如何使用Java开发一个基于SpringSecuritySAML的单点登录系统引言:随着互联网的快速发展,越来越多的应用程序被开发出来。在这些应用程序中,用户登录是最常见的功能之一。然而,对于企业级应用程序,用户需要在多个系统中进行登录,这将导致用户的登录体验非常糟糕。为了解决这个问题,单点登录系统(SingleSign-On,简称SSO)应运而生。简

GO 验证访问令牌(keycloak) GO 验证访问令牌(keycloak) Feb 09, 2024 am 09:30 AM

我正在尝试使用GO实现访问令牌验证。但我在网上看到的例子似乎只是用TOKEN_SECRET来验证它。但是我习惯了在Javaspring中编程,并且不需要使用TOKEN_SECRET。我只是提供jwk-set-uri,它会检查有效性(自动-安全过滤器等),我知道它与oauth服务器通信并进行此验证。Go中是否没有库可以通过向oauth服务器发出请求来检查令牌是否有效?我知道我知道我可以通过向oauth服务器的用户信息端点发出请求来手动进行此操作:http://localh

Spring Security权限控制框架使用指南 Spring Security权限控制框架使用指南 Feb 18, 2024 pm 05:00 PM

在后台管理系统中,通常需要访问权限控制,以限制不同用户对接口的访问能力。如果用户缺乏特定权限,则无法访问某些接口。本文将用waynboot-mall项目举例,给大家介绍常见后管系统如何引入权限控制框架SpringSecurity。大纲如下:waynboot-mall项目地址:https://github.com/wayn111/waynboot-mall一、什么是SpringSecuritySpringSecurity是一个基于Spring框架的开源项目,旨在为Java应用程序提供强大和灵活的安

如何使用Java开发一个基于Spring Security OAuth2的单点登录系统 如何使用Java开发一个基于Spring Security OAuth2的单点登录系统 Sep 20, 2023 pm 01:06 PM

如何使用Java开发一个基于SpringSecurityOAuth2的单点登录系统引言:随着互联网的高速发展,越来越多的网站和应用程序需要用户进行登录,而用户却不希望为每个网站或应用程序都记住一个账号和密码。单点登录系统(SingleSign-On,简称SSO)能够解决这个问题,允许用户在一次登录后,无需重复认证就可以访问多个网站和应用程序。本文将介绍

Spring Security 在其余服务中获取经过身份验证和未经过身份验证的用户的用户信息 Spring Security 在其余服务中获取经过身份验证和未经过身份验证的用户的用户信息 Feb 08, 2024 pm 11:00 PM

我有一个springrest服务,我想将它用于经过身份验证和未经身份验证的用户。如果用户经过身份验证,我想从securitycontextholder.getcontext().getauthentication()获取用户信息。如果我使用.antmatchers("/app/rest/question/useroperation/list/**").permitall()在ouath2配置中,如下所示,然后我可以获取用户信息经过身份验证的用户,但未经过身份验证的用户会出现40

Java RESTful API 烹饪书:为每个应用程序打造完美的服务 Java RESTful API 烹饪书:为每个应用程序打造完美的服务 Mar 27, 2024 pm 12:11 PM

引言在当今互联互通的世界中,RESTfulapi已成为应用程序之间进行通信的关键机制。借助Java这一强大的编程语言,您可以构建高效、可扩展且维护良好的RESTfulAPI。第1章:RESTfulAPI基础RESTful架构的原则和最佳实践Http方法、状态代码和响应标头JSON和XML等数据格式第2章:设计和建模RESTfulAPIRESTfulAPI设计原则资源建模和URI设计版本控制和HATEOAS第3章:使用SpringBoot构建RESTfulAPISpringBoot简介和入门构建和

vue框架和springboot框架前后端怎么交互 vue框架和springboot框架前后端怎么交互 Apr 06, 2024 am 01:51 AM

Vue.js 和 Spring Boot 通过以下方式交互:RESTful API:Vue.js 使用 Axios 发送异步 HTTP 请求,Spring Boot 提供 RESTful API 实现。数据传递:数据通过请求和响应传递,如请求正文或查询参数。请求方法:GET、POST、PUT 和 DELETE 等 HTTP 请求方法用于指定操作。路由:Spring Boot @RequestMapping 注解定义控制器路由,Vue.js 使用 Vue Router 定义界面路由。状态管理:Vu

See all articles