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

这篇具有很好参考价值的文章主要介绍了keycloak~使用jwks验证token的合法性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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: fabao
    resource: pkulaw
    client-key-password: c0b7ab8e-485b-4a10-bff8-7c7d3f472096
    auth-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/certs
  certs-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 valid
        Jwk jwk = jwtService.getJwk();
        Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);

        algorithm.verify(jwt);

        // check JWT role is correct
        List<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 active
        Date expiryDate = jwt.getExpiresAt();
        if(expiryDate.before(new Date()))
            throw new Exception("token is expired");

        // all validation passed
        return 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文章来源地址https://www.toymoban.com/news/detail-856282.html

到了这里,关于keycloak~使用jwks验证token的合法性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何用Java校验SQL语句的合法性?有这5种解决方案

    要在Java中校验SQL语句的合法性,可以使用JDBC API中提供的Statement接口的 execute() 方法。这个方法会尝试执行给定的SQL语句,如果SQL语句不合法,则会抛出一个SQLException异常。因此,我们可以利用这个异常来判断SQL语句的合法性。 以下是一个简单的示例代码: 在这个示例代码中

    2024年02月07日
    浏览(40)
  • ViewUI表格Table嵌套From表单-动态校验数据合法性的解决方法

    项目需求:在表格中实现动态加减数据,并且每行表格内的输入框,都要动态校验数据,校验不通过,不让提交数据,并且由于表格内部空间较小,我仅保留红边框提示,文字提示给隐藏了,不然表格内的框会很大很难看。 如果,你需要提示的话,不要 show-message 属性 提示:

    2024年02月13日
    浏览(41)
  • keycloak~jwks-rsa中使用的设计模式

    com.auth0.jwk组织下面的jwks-rsa包,主要实现的是通过公钥对jwt的签名进行验证,在这个包中,它使用了 包装器 的设计模式,对默认的jwks提供者添加了一缓存的支持,通过建立一个 GuavaCachedJwkProvider 类,传入一个默认的 UrlJwkProvider 来将这个Provider进行包装,让它具有缓存的能力

    2024年04月23日
    浏览(27)
  • keycloak~Googl的reCAPTCHA验证

    reCAPTCHA是Google公司推出的一项验证服务,使用十分方便快捷,在国外许多网站上均有使用。它与许多其他的人机验证方式不同,它极少需要用户进行各种识图验证。 它的使用方式如下如所示,只需勾选复选框即可通过人机验证。 虽然简单但效果很好,因为Google会收集一些浏

    2024年02月08日
    浏览(50)
  • 最详细的Keycloak教程(建议收藏):Keycloak实现手机号、验证码登陆——(二)Keycloak与SpringBoot的集成

    上一篇已经介绍了keycloak的下载与使用: Keycloak的下载与使用 本文章和大家分享keycloak怎么去集成springboot项目,以及怎么去做接口权限的校验。 PS:根据红帽的公告,目前在springboot 3.x版本已经不支持keycloak适配器,所以本章基于 springboot 2.7.16 版本,集成keycloak做登录校验,并

    2024年02月05日
    浏览(65)
  • keycloak~jwt的rs256签名的验证方式

    keycloak开放接口地址:/auth/realms/fabao/.well-known/openid-configuration RSA算法是一种非对称加密算法,其安全性基于大整数分解的困难性。在RSA算法中,有以下几个关键参数: n(模数) :n 是一个大整数,通常为两个大素数 p 和 q 的乘积,即 n = p * q。n 用于生成公钥和私钥,并且决

    2024年04月22日
    浏览(55)
  • 使用JWT生成token实现权限验证

            点击登录按钮,后端验证账号密码是否通过,如果通过则生成token,把token发送给前端,前端保存到cookie(前后端分离是不能使用保存session,因为每次发送ajax请求响应后都会断开服务器,就会导致session生命周期就销毁掉,然后再发送请求时再重新连接服务器,s

    2023年04月08日
    浏览(54)
  • java用正则方法验证文件名是否合法

    Java中用到文件操作时,经常要验证文件名是否合法. 用File类的createNewFile()方法的确很管用.但当要批量验证时,效率上就会有问题.正则匹配的开销比创建文件少了很多. 那么一个合法的文件(Win下)应该符合如下规则:  1.文件名不能为空,空在这里有两个意思:  文件名(包括扩展名

    2024年02月10日
    浏览(33)
  • 利用RSA加密打造强大License验证,确保软件正版合法运行

      概述: C#软件开发中,License扮演着确保软件合法使用的重要角色。采用RSA非对称加密方案,服务端生成带签名的License,客户端验证其有效性,从而实现对软件的授权与安全保障。 License(许可证)在C#软件开发中被广泛应用,以确保软件在合法授权的环境中运行。常见场景

    2024年02月19日
    浏览(35)
  • 在Keycloak中实现多租户并在ASP.NET Core下进行验证

    Keycloak是一个功能强大的开源身份和访问管理系统,提供了一整套解决方案,包括用户认证、单点登录(SSO)、身份联合、用户注册、用户管理、角色映射、多因素认证和访问控制等。它广泛应用于企业和云服务,可以简化和统一不同应用程序和服务的安全管理,支持自托管

    2024年04月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包