支持“个人访问令牌”或“ API密钥”

时间:2020-05-13 13:33:29

标签: oauth-2.0 keycloak openid-connect

当我使用Keycloak处理身份验证并使用它发行的令牌来保护我的API时,keycloak是否提供一种类似于Github的方式来支持个人访问令牌?当我的应用程序使用Web浏览器时,可以通过OIDC流登录正常,但是如何处理CLI或无头API脚本的登录?

我可以支持密码流,在提供用户名和密码后,我将获得JWT令牌,但是我假设一旦用户配置了2FA,或者如果他们在后端使用SAML,则所有押注都将作为用户名和密码无法让您访问。这正是Github提供个人访问令牌的原因。有什么方法可以使用Keycloak来实现类似的功能,还是必须在自己的应用程序中构建它,然后接受JWT之外的那些令牌。

我希望的是Keycloak能够在用户存储区中生成和存储个人访问令牌,用户可以通过Keycloak提供给用户的UI来生成和撤消该访问令牌。然后,我的CLI可以使用此令牌获取JWT,然后以与网络浏览器或其他客户端相同的方式继续调用我的API。

1 个答案:

答案 0 :(得分:1)

最近的Keycloak版本中增加了一些在CLI脚本编写过程中利用OTP的支持。到目前为止,我还没有玩过它,所以我不能给你介绍任何食谱。尝试从身份验证-> HTTP挑战流程设置开始。

关于用户令牌,您可以将所需的功能实现为Keycloak的SPI扩展(请参阅docs中的“服务器开发”部分)。我认为应该有两个组成部分:

  1. 用户令牌发行者
  2. 将在您的客户端的身份验证流程中使用的自定义身份验证器

这是一个粗略的例子:

  1. 让用户令牌像UUID字符串一样,因此所有用户令牌都可以存储在用户属性中(用户设置Admin UI中的“属性”选项卡)。

  2. 您的某些API可能会引入专用端点,该端点将接受有效的访问令牌<生成新的UUID用户令牌,通过Admin API将其存储在keycloak用户属性中,然后将此令牌返回给用户。

  3. 然后,我们创建自定义的Authenticator SPI实现,该实现将从直接授予身份验证请求中提取用户令牌并对其进行验证。

  4. 最后一步是为相应的OIDC客户端正确配置直接授予身份验证流程。如果在身份验证请求中未提供用户令牌,则此流程应与默认流程一样工作,并且应仅验证用户令牌,而在存在用户令牌的情况下忽略其他凭据。

Keycloak“服务器开发”文档和keycloak源代码对于执行此类任务非常有帮助。