keycloak自定义生成token流程

简介: keycloak自定义生成token流程

具体流程如下
生成keystore.jks文件

  1. 登录keycloak,进入管理控制台->clients 菜单

image.png

  1. 点击右上创建client

客户端协议选择 openid-connect
image.png

  1. 保存后,设置客户端协议为:credential

image.png
有效的重定向URI可随意输入,如:https://github.com/ 保存后,即可选择凭据标签页
image.png
客户端认证器选择:Signed Jwt,点击生成新密钥和证书,进入如下界面
image.png
点击生成和下载,将下载的keystore.jks文件保存
如果觉得上述步骤过于繁琐,可直接借用keycloak自带的client:account,生成keystore.jks
image.png
生成keystore.jks文件后,再修改回来

上传keystore.jks文件到服务器并添加密钥链
1.将生成的keystore.jks文件上传到keycloak服务器,并拷贝路径
linux服务器可通过yum 安装 lrzsz插件,yum install -y lrzsz,通过命令rz -bye上传

2.添加密钥链
选择 Realm Settings -> Keys -> Providers,点击右上角下拉框,新增java-keystore,在跳转页面输入Keystore(keystore.jks存放路径)、Keystore Password、Key Alias、Key Password保存
image.png
image.png
保存后,
image.png
可复制kid,在页面http://localhost:8080/auth/realms/demo/protocol/openid-connect/certs验证是否生效
image.png
外部应用生成jwt token
maven添加必要的依赖
image.png
以后代码供参考
BaseAccessToken.java

@SuperBuilder
public abstract class BaseAccessToken {
    @JsonProperty("exp")
    private long expiration;

    @JsonProperty("aud")
    @Singular
    private Set<String> audiences;

    @JsonProperty("iss")
    private String issuer;

    @JsonProperty("roles")
    @Singular
    private Set<String> roles;

    @JsonProperty("scope")
    private String scope;
}

KeycloakJwtProperties.java

@Getter
@Setter
public class KeycloakJwtProperties {
    private boolean enabled = false;
    private String clientKeystoreFile;
    private String clientKeystorePassword;
    private String clientKeyPassword;
    private String clientKeyAlias;
}

KeyPairUtil.java

    @Getter
    private KeyPair keyPair;

    public KeyPairUtil(KeycloakJwtProperties properties) {
        loadKeystore(properties);
    }

    private void loadKeystore(KeycloakJwtProperties properties) {
        keyPair = KeystoreUtil.loadKeyPairFromKeystore(properties.getClientKeystoreFile(), properties.getClientKeystorePassword(), properties.getClientKeyPassword(), properties.getClientKeyAlias(), KeystoreUtil.KeystoreFormat.JKS);
    }
}

KeycloakSignedJwtAutoConfiguration.java

@ConditionalOnProperty("jwt.enabled")
@EnableConfigurationProperties({KeycloakJwtProperties.class})
public class KeycloakSignedJwtAutoConfiguration {
    private final KeycloakJwtProperties keycloakJwtProperties;

    public KeycloakSignedJwtAutoConfiguration(KeycloakJwtProperties keycloakJwtProperties) {
        this.keycloakJwtProperties = keycloakJwtProperties;
    }

    @Bean
    public KeyPairUtil keyPairUtil(){
        return new KeyPairUtil(keycloakJwtProperties);
    }
}

spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xxx.oauth2.config.KeycloakSignedJwtAutoConfiguration
项目发布到nexus私有仓库,其他spring boot项目导入依赖、增加配置后,通过下面代码生成自定义token
application.yml

  security:
    oauth2:
      client:
        provider:
          oidc:
            issuer-uri: http://cas.xxx.net/auth/realms/demo

jwt:
  enabled: true
  client-keystore-file: /Users/jj/Documents/workspaces/Refactor/ops/src/main/resources/keystore.jks
  client-keystore-password: 123456
  client-key-password: 123456
  client-key-alias: demo-client
public class StartRunner implements CommandLineRunner {
    private final Logger logger = LoggerFactory.getLogger(StartRunner.class);
    private final KeyPairUtil keyPairUtil;

    public StartRunner(KeyPairUtil keyPairUtil) {
        this.keyPairUtil = keyPairUtil;
    }

    @Override
    public void run(String... args) throws Exception {
        testCustomToken();
    }

    private void testCustomToken() throws Exception {
        DeviceAccessToken deviceAccessToken = DeviceAccessToken.builder()
            .expiration(Instant.now().plus(1, ChronoUnit.DAYS).getEpochSecond())
            .issuer("http://cas.xxx.net/auth/realms/demo")
            .audience("device")
            .role("ROLE_DEVICE")
            .role("ROLE_ADMIN")
            .scope("device")
            .deviceId(111L)
            .serialNumber("20720D39021C")
            .hospitalId(222L)
            .commonDeptId(333L)
            .customDeptId(444L)
            .customDeptName("自建科室")
            .locationId(555L)
            .locationName("1床")
            .provinceId(666L)
            .cityId(777L)
            .deviceType(DeviceType.TABLET.toString()).build();

        String token = new JWSBuilder().jsonContent(deviceAccessToken).rsa256(keyPairUtil.getKeyPair().getPrivate());
        logger.debug("token: {}", token);
    }
}

客户端通过上述步骤生成token访问受保护的资源时,会遍历cert做token的有效性认证,这样keycloak只需要提供公钥供app应用做token的有效性验证,token的生成和使用由app自身控制
image.png

目录
相关文章
|
XML 域名解析 JSON
【RESTful】RESTful API 接口设计规范 | 示例
【RESTful】RESTful API 接口设计规范 | 示例
13219 0
【RESTful】RESTful API 接口设计规范 | 示例
|
存储 SQL JSON
信创迁移适配实战-MySQL到达梦数据库DM8的数据迁移
信创迁移适配实战-MySQL到达梦数据库DM8的数据迁移
7020 0
信创迁移适配实战-MySQL到达梦数据库DM8的数据迁移
|
安全 API 数据安全/隐私保护
基于Keycloak的认证与授权
【10月更文挑战第27天】Keycloak 是一个开源的身份和访问管理解决方案,提供用户认证、授权、单点登录等功能,保护应用程序和服务的安全。其认证流程包括用户登录、凭证验证、身份验证令牌生成、令牌返回给应用、应用验证令牌、用户身份确认。Keycloak 支持资源定义、权限定义、角色创建与分配、用户角色分配、访问请求与授权决策等授权流程。其优势在于集中式管理、高安全性、良好扩展性和社区支持。适用于企业应用集成、微服务架构、移动应用及 API 安全等多种场景。
693 3
|
安全 网络协议 网络安全
【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题
【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题
25990 0
|
JSON 缓存 Java
优雅至极!Spring Boot 3.3 中 ObjectMapper 的最佳实践
【10月更文挑战第5天】在Spring Boot的开发中,ObjectMapper作为Jackson框架的核心组件,扮演着处理JSON格式数据的核心角色。它不仅能够将Java对象与JSON字符串进行相互转换,还支持复杂的Java类型,如泛型、嵌套对象、集合等。在Spring Boot 3.3中,通过优雅地配置和使用ObjectMapper,我们可以更加高效地处理JSON数据,提升开发效率和代码质量。本文将从ObjectMapper的基本功能、配置方法、最佳实践以及性能优化等方面进行详细探讨。
1072 2
|
安全 数据安全/隐私保护 UED
|
存储 监控 前端开发
Sentry 监控部署与使用(详细流程)
Sentry 监控部署与使用(详细流程)
14278 1
|
安全 JavaScript
Vue3+Pinia实现Keycloak高效身份验证!
Vue3+Pinia实现Keycloak高效身份验证!
|
安全 Java 关系型数据库
Keycloak单点登录
Keycloak单点登录
615 0