keycloak~使用jwks验证token的合法性

news/发布时间2024/5/18 17:22:06

keycloak提供了jwks服务,其地址可以在/auth/realms/fabao/.well-known/openid-configuration的返回结果中找到,jwks_uri它表示了公钥的颁发者,可以使用颁发出来的公钥来验证token的签名,基地址也是固定的/auth/realms/fabao/protocol/openid-connect/certs

springboot构建keycloak的token校验服务

依赖包

jwt的解析以来于java-jwt包,由jwks服务解析依赖于jwks-rsa包,jwks是什么,可以看这里

   <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${spring-boot-dependencies.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.keycloak.bom</groupId><artifactId>keycloak-adapter-bom</artifactId><version>14.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- keycloak --><dependency><groupId>org.keycloak</groupId><artifactId>keycloak-spring-boot-starter</artifactId></dependency><!-- jwt --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.11.0</version></dependency><dependency><groupId>com.auth0</groupId><artifactId>jwks-rsa</artifactId><version>0.12.0</version></dependency></dependencies>

相关配置

keycloak:realm: fabaoresource: pkulawclient-key-password: c0b7ab8e-485b-4a10-bff8-7c7d3f472096auth-server-url: http://192.168.xx.xx:8080/auth/realms/fabao/protocol/openid-connect/auth
kc:jwk-set-uri: http://192.168.xx.xx:8080/auth/realms/fabao/protocol/openid-connect/certscerts-id: E_6ih35yTLJMieI0vqg9MmTQrJ6RcUSxiXeNdcMaoYk

jwks服务

@Service
public class JwtService {@Value("${kc.jwk-set-uri}")private String jwksUrl;@Value("${kc.certs-id}")private String certsId;@Cacheable(value = "jwkCache")public Jwk getJwk() throws Exception {return new UrlJwkProvider(new URL(jwksUrl)).get(certsId);}
}

校验token

这只是个简单的demo,真实项目中,这种校验的代码应该写在拦截器中,统一进行处理

 @GetMapping("/teacher")public HashMap teacher(@RequestHeader("Authorization") String authHeader) {try {DecodedJWT jwt = JWT.decode(authHeader.replace("Bearer", "").trim());// check JWT is validJwk jwk = jwtService.getJwk();Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);algorithm.verify(jwt);// check JWT role is correctList<String> roles = ((List)jwt.getClaim("realm_access").asMap().get("roles"));if(!roles.contains("teacher"))throw new Exception("not a teacher role");// check JWT is still activeDate expiryDate = jwt.getExpiresAt();if(expiryDate.before(new Date()))throw new Exception("token is expired");// all validation passedreturn new HashMap() {{put("role", "teacher");}};} catch (Exception e) {logger.error("exception : {} ", e.getMessage());return new HashMap() {{put("status", "forbidden");}};}
}
JWKS(JSON Web Key Set)是一个包含一组公钥的 JSON 格式文件,用于在使用 JSON Web Token(JWT)进行身份验证和授权时,验证 JWT 的签名。JWKS 通常用于在 OAuth 2.0 和 OpenID Connect 等认证协议中进行密钥管理。

在 JWKS 中,每个公钥都包含了算法、公钥类型和实际的公钥值。通过 JWKS,验证方可以获取到签发方使用的公钥,从而验证 JWT 的签名是否有效。

JWKS 包含以下主要字段:

  • keys:一个数组,包含多个公钥信息的对象,每个对象包括了公钥的相关信息,如算法、公钥类型和公钥值等。

示例 JWKS 文件如下所示:

{"keys": [{"kty": "RSA","kid": "123","use": "sig","alg": "RS256","n": "public_key_value","e": "AQAB"}]
}

在使用 JWT 进行身份验证时,验证方可以通过获取并解析 JWKS 文件中的公钥信息,然后使用这些公钥来验证 JWT 的签名是否有效。这样可以提高安全性,并确保只有合法的签发方才能生成有效的 JWT。

参考:https://developers.redhat.com/blog/authentication-and-authorization-using-the-keycloak-rest-api#keycloak_connection_using_a_java_application

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/00422424.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

单元测试必备:Asp.Net Core代码覆盖率实战,打造可靠应用 !

引言 在前几章我们深度讲解了单元测试和集成测试的基础知识,这一章我们来讲解一下代码覆盖率,代码覆盖率是单元测试运行的度量值,覆盖率通常以百分比表示,用于衡量代码被测试覆盖的程度,帮助开发人员评估测试用例的质量和代码的健壮性。常见的覆盖率包括语句覆盖率(Line Co…

读天才与算法:人脑与AI的数学思维笔记07_数字绘画

数字绘画1. 数字绘画 1.1. 事物的可预测性与不可预测性构成了我们熟识的世界 1.1.1. 汤姆斯托帕德(Tom Stoppard) 1.2. 艺术作品就是通过各种形式给人带来美的感受,从而使人们获得精神上的愉悦与放松 1.3. “像素化”的画作激发了人…

不如你把我杀了吧 | 绘制自定义的 3D 地图

如何根据自己的json数据绘制类似这种地图,仅供参考 1、准备数据。 因为自定义,所以全部的数据都来源自己。我们需要准备地图数据(包括但不限于地图轮廓数据,点数据) 这里我的数据使用的是arcgis导出json数据,因此数据格式足够规范,这省去了很多的麻烦。 2、导入相关库、…

任务栏“居中”显示!这个美观又实用的小技巧

有网友表示,电脑任务栏的软件图标都是靠左显示的,不太美观,有木有办法让它们“居中”呢?其实是可以的,今天我就教大家如何设置,快来学一招吧! 1、首先,新建一个文件夹,名字/位置随意;2、右键点任务栏,选择【工具栏】-【新建工具栏】,选择刚才建的文件夹; 3、接着…

SRPCore ColorPyramid优化

很早之前就看HDRP里面的Color ColorPyramid的生成不爽了,都不知道为什么明明有现成的ColorPyramid.compute放着不用,还是用的是PixelShader生成。DrawCall数量多,效率也不够Compute的方式快。 这篇文章主要解析ColorPyramid.compute怎么用LDS优化GuassianBlur以及不同方式Co…

删除顺序表L中下标为p的元素

数据结构 顺序表 笔试题2:删除顺序表L中下标为p(0<p<length-1)的元素,成功返回1,否则返回0,并将被删除元素的值赋给e/*************************************************************************************** file name: 1.c* author : lu.ciana.598393@gm…