首页 > 其他分享 >keycloak~使用jwks验证token的合法性

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

时间:2024-04-23 09:22:05浏览次数:32  
标签:公钥 jwks JWKS JWT token new keycloak

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

标签:公钥,jwks,JWKS,JWT,token,new,keycloak
From: https://www.cnblogs.com/lori/p/18152109

相关文章

  • ASP.NET Core Web API下基于Keycloak的多租户用户授权的实现
    在上文《Keycloak中授权的实现》中,以一个实际案例介绍了Keycloak中用户授权的设置方法。现在回顾一下这个案例:服务供应商(ServiceProvider)发布/WeatherForecastAPI供外部访问在企业应用(Client)里有三个用户:super,daxnet,nobody在企业应用里有两个用户组:administrators,users在企......
  • cookie session token
    【一】浏览器保存状态【1】http请求的特点#1.无状态每一次的http请求,浏览器都不会保存当时的状态,如用户的登录#2.无连接每个http请求都是一次独立的交互,无连接也可以称为短链接,因为只有发送请求以及得到响应的那么一刻时间服务端和浏览器会有连接,他的连接生命周期非常短暂......
  • 分词器tokenizers
    总览为了让语言变为模型能够理解的形式(tokens),每个字词必须映射为独一无二的序号,这时需要使用分词器tokenizer对语言进行转换。例如对于“areyouok”,gemma模型的tokenizer会将之转换为一个List:[2,895,692,4634]。顺便一提,第一个序号2是开始标记<bos>。本文是学......
  • jwt json web token
    签发----登录成功后签发认证---需要登录才能访问的接口,通过认证才能继续操作2原理-----jwt和session,cookie区别2.1cookies2.2session2.2.1sessionmiddleware2.3jwttooken长什么样?三段式,用.分割每段b64编码 1st段:公司信息,加密方式就是jwt,一般固定 2nd......
  • keycloak~jwt的rs256签名的验证方式
    接口地址keycloak开放接口地址:/auth/realms/fabao/.well-known/openid-configurationrsa算法相关术语RSA算法是一种非对称加密算法,其安全性基于大整数分解的困难性。在RSA算法中,有以下几个关键参数:n(模数):n是一个大整数,通常为两个大素数p和q的乘积,即n=p*q。n用......
  • feign携带token
    方式1:@ConfigurationpublicclassFeignConfigimplementsRequestInterceptor{@Overridepublicvoidapply(RequestTemplaterequestTemplate){ServletRequestAttributesattributes=((ServletRequestAttributes)RequestContextHolder.getRequestAttrib......
  • 什么是token,为什么需要token
    1.为什么需要token随着互联网的发展,为了更安全,以及更好的用户体验,逐渐产生了token这个技术方案之所以使用token是因为http/https协议本身是无状态的,不能进行信息的存储(cookie可以进行信息存储,但存在一些限制)token的作用是为了加强用户信息安全性,而添加的一层验证,去......
  • Keycloak中授权的实现
    在Keycloak中实现授权,首先需要了解与授权相关的一些概念。授权,简单地说就是某个(些)用户或者某个(些)用户组(Policy),是否具有对某个资源(Resource)具有某种操作(Scope)的权限(Permission)。所以,授权是一种权限管理,它建立在认证的基础上:用户首先要完成认证(Authentication),才能谈授权(Authorizatio......
  • Jmeter模拟用户并发token参数化
    场景:项目需求,模拟用户并发签到,要求签到数据能记录到数据库。分析:签到接口需要tocken,单个tocken只能签到一次,需要多个tocken一起并发。脚本如下:        解决返回的乱码问题。  ......
  • keycloak~RequiredActionProvider的使用
    使用场景RequiredActionProvider,它是在认证过程中,需要当前登录的用户执行个性化的动作;当用户符合条件,就被执行RequiredActionProvider对作,当RequiredActionProvider没有正常提交(context.success())之前,当前用户仍然是未登录状态,这在keycloak框架中,也有一些默认的个性化动作,它与......