中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

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: //192.168.xx.xx:8080/auth/realms/fabao/protocol/openid-connect/auth
kc:
  jwk-set-uri: //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

這只(zhi)是個(ge)簡單的(de)demo,真實項(xiang)目中(zhong),這種校驗的(de)代碼應該寫(xie)在攔截(jie)器中(zhong),統一進行處理

 @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 中,每個公(gong)(gong)鑰(yao)都包含了(le)算法、公(gong)(gong)鑰(yao)類型(xing)和實際的公(gong)(gong)鑰(yao)值。通(tong)過 JWKS,驗(yan)(yan)證(zheng)方(fang)可以獲取到簽發方(fang)使用的公(gong)(gong)鑰(yao),從而驗(yan)(yan)證(zheng) JWT 的簽名是否有效。

JWKS 包含以下主要字段:

  • keys:一個數組,包含多個公鑰信息的對象,每個對象包括了公鑰的相關信息,如算法、公鑰類型和公鑰值等。

示例 JWKS 文件如下所示:

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

在使用 JWT 進行身份驗證時,驗證方可以通過獲取并解析 JWKS 文件中的公鑰信息,然后使用這些公鑰來驗證 JWT 的簽名是否有效。這樣可以提高安全性,并確保只有合法的簽發方才能生成有效的 JWT。

參考:

posted @ 2024-04-23 09:21  張占嶺  閱讀(1761)  評論(0)    收藏  舉報