Keycloak-6.0.1自定义身份验证器SPI

时间:2019-08-13 03:50:41

标签: java authentication keycloak keycloak-services

我正在尝试实现自定义密钥克隆Authenticator SPI,以针对外部数据源/其余服务进行身份验证。计划是将它们迁移到密钥斗篷中。

  
    

更新了浏览器流程(复制并创建新流程并绑定它)。

         

用户首次登录时,将显示自定义主题登录屏幕。

         

在提交时,使用“自定义SPI”对外部服务进行身份验证。

         

成功后,在keycloak数据源上创建用户。

         

创建自定义映射器,以在令牌上添加额外的用户属性。

  

我正在遵循官方指南https://www.keycloak.org/docs/latest/server_development/index.html#_auth_spi_walkthrough的8.3节,该节与我所需要的非常相似。

另外,请遵循示例(https://github.com/keycloak/keycloak/tree/master/examples/providers/authenticator),我认为说明并未将其映射到新版本。

例如: 在您的副本中,单击“操作”菜单项,然后单击“添加执行”。选择秘密问题。

  
    

在Keycloak-6.0.1中,没有诸如“选择机密问题”之类的执行。我真的不需要这个,但我至少要尝试设置此流程以掌握流程的工作原理。

  

接下来,您必须注册您创建的必需操作。单击Authenticaiton菜单中的“必需的操作”选项卡。单击注册按钮,然后选择新的“必需的操作”。

  
    

所需的操作上没有此类“注册”按钮。

  

我所做的事情。 创建新领域 注册的UI客户端 在密钥库表的新领域中创建了新用户。 登录时的用户界面重定向到Keycloak用户界面,并成功通过身份验证,并能够使用javascript适配器成功检索令牌

componentDidMount = () => {
        const keycloak = Keycloak('/keycloak.json');
        keycloak.init({onLoad: 'login-required'}).then(authenticated => {
            this.setState({ keycloak: keycloak, authenticated: authenticated })
        })
    }

....
....

if(this.state.keycloak) {
            if(this.state.authenticated) return (
                <div className="contact-body">
                 <p>Name: {this.state.name}</p>
                 <p>Email: {this.state.email}</p>
                 <p>ID: {this.state.id}</p>
               </div>
              );
      }
}

想将Keycloak登录UI功能(如OTP)与自定义身份验证器SPI一起使用。在自定义身份验证器SPI中,获取诸如用户名和密码之类的表单字段,并使用外部服务对其进行身份验证。然后在Keycloak DB中创建用户。

管理员可以锁定/暂时将用户锁定在keycloak的领域内吗?

我打算使用的另一种选择是,更新onsubmit上的login.ftl以将用户名/密码发布到自定义服务中,并带有作为查询参数传递的keycloak url。
将针对自定义服务对其进行验证,在keycloak数据库上创建用户,然后重定向到在查询参数中传递的keycloak url。这似乎不是正确的方法。

任何帮助/想法都将非常有帮助。

2 个答案:

答案 0 :(得分:0)

这是您实施的错误SPI。 对于外部数据源或服务集成,必须实现自定义的用户存储SPI

答案 1 :(得分:0)

您应该使用“用户存储SPI”。这将是Keycloak Doc

上的第11节

如果您需要额外的/自定义身份验证(例如机密问题),则需要第8节。