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

目录
相关文章
|
2月前
|
人工智能 测试技术 API
Claude Code + MCP:代码助手的边界,正在被重新划线
Claude Code接入MCP协议后,突破本地代码助手边界,可调用GitHub、数据库、浏览器、API等外部工具,实现跨系统任务编排。对测试开发而言,这意味着AI能深度参与需求分析、接口测试、UI脚本生成、数据库校验、回归范围判断与质量报告生成,正从“代码问答工具”升级为“工程执行系统”。
|
搜索推荐 Shell
bpmn-js打造最强flowable流程设计器
在企业系统中,流程引擎至关重要。Flowable虽强大,但默认设计器功能有限。本文基于 bpmn-js 打造增强版 Flowable 设计器,支持丰富自定义属性与后端联动。bpmn-js 优势明显:原生支持 BPMN 2.0、可扩展性强、社区活跃。节点涵盖多种事件、任务、网关等,满足复杂业务需求。示例效果可见在线预览。
1456 73
|
9月前
|
canal 关系型数据库 MySQL
数据同步神器-Canal
Canal是阿里巴巴开源的MySQL增量日志解析工具,通过模拟MySQL主从复制机制,实时捕获数据库变更,实现数据同步至Kafka、Elasticsearch等系统,广泛应用于数据同步、监控、备份与迁移场景。
6719 5
|
安全 Unix Linux
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
152630 65
|
存储 Kubernetes 中间件
【中间件-keycloak】第一次改开源中间件keycloak总个结
【中间件-keycloak】第一次改开源中间件keycloak总个结
1069 100
【中间件-keycloak】第一次改开源中间件keycloak总个结
|
安全 API 数据安全/隐私保护
基于Keycloak的认证与授权
【10月更文挑战第27天】Keycloak 是一个开源的身份和访问管理解决方案,提供用户认证、授权、单点登录等功能,保护应用程序和服务的安全。其认证流程包括用户登录、凭证验证、身份验证令牌生成、令牌返回给应用、应用验证令牌、用户身份确认。Keycloak 支持资源定义、权限定义、角色创建与分配、用户角色分配、访问请求与授权决策等授权流程。其优势在于集中式管理、高安全性、良好扩展性和社区支持。适用于企业应用集成、微服务架构、移动应用及 API 安全等多种场景。
1179 3
|
NoSQL 网络安全 Redis
蓝易云 - 【redis问题】Caused by: io.netty.channel
以上就是解决"Caused by: io.netty.channel"错误的一些可能的方法。
448 2
|
消息中间件 Kubernetes 监控
实时计算 Flink版操作报错合集之在编译源码时遇到报错:无法访问,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
前端开发 JavaScript API
Keycloak快速上手指南(一)
Keycloak快速上手指南
3319 0

热门文章

最新文章