返回

在 Keycloak 中扩展令牌:使用扩展令牌模式自定义令牌数据

java

使用扩展令牌模式扩展 Keycloak 令牌

引言

在现代应用程序开发中,自定义令牌数据对于提供针对性的用户体验和增强安全性至关重要。然而,使用基本 Keycloak 令牌模式可能不足以满足特定的数据要求。本文将深入探讨如何利用扩展令牌模式在 Keycloak 令牌中注入自定义数据。

问题

如果你需要在 Keycloak 令牌中包含用户特定数据,但基本信息无法满足你的需求,那么你需要超越修改后的插件。使用扩展令牌模式,你可以动态地将自定义数据附加到令牌中,从而为你的应用程序提供更大的灵活性。

解决方案:扩展令牌模式

扩展令牌模式为在 Keycloak 令牌中包含自定义数据提供了安全且高效的方法。它允许你创建自己的令牌提供程序,该提供程序负责根据请求的参数动态生成数据。

步骤:

  1. 创建扩展令牌提供程序: 实现 org.keycloak.authorization.client.util.AuthorizationClientUtil 接口,创建自定义令牌提供程序类。

  2. 配置 Keycloak:

    • 创建一个包含自定义数据键的客户端范围。
    • 添加一个扩展类型协议映射器,并指定自定义令牌提供程序。
  3. 请求带有自定义数据的令牌: 在请求令牌时,包括客户端范围和自定义数据键作为附加参数。

  4. 在扩展令牌提供程序中获取自定义数据:setClaim 方法中,使用 AuthorizationContext 获取自定义数据并将其添加到令牌中。

优点

  • 动态控制: 允许你根据请求参数动态控制自定义数据。
  • 安全: 遵循 Keycloak 的安全标准,防止数据泄露和篡改。
  • 可扩展: 提供了扩展 Keycloak 令牌功能的灵活方法。

示例

考虑一个场景,你需要在令牌中包含用户的首选语言。按照上述步骤,你可以:

  • 创建一个名为 CustomLanguageProvider 的扩展令牌提供程序。
  • 在 Keycloak 中创建一个客户端范围 custom-language-scope 并添加一个扩展协议映射器,指向 CustomLanguageProvider
  • 请求令牌时,包括 scope=custom-language-scope&language=en 参数。
  • CustomLanguageProvidersetClaim 方法中,获取自定义语言并将其添加到令牌中。

常见问题解答

1. 我可以在令牌中存储任何类型的数据吗?
答:可以,只要它符合 Keycloak 要求的 JSON 格式。

2. 我可以使用扩展令牌模式替换基本令牌模式吗?
答:不,扩展令牌模式补充了基本模式,允许你在需要时添加额外的自定义数据。

3. 如何保护自定义数据免遭未经授权的访问?
答:自定义数据仅存储在令牌中,在传输过程中使用 TLS/SSL 加密。

4. 是否可以将扩展令牌模式与其他 Keycloak 功能结合使用?
答:是的,扩展令牌模式可以与 Keycloak 的其他功能配合使用,例如客户端凭证授权。

5. 如何在生产环境中使用扩展令牌模式?
答:在生产环境中使用扩展令牌模式之前,请确保在安全受控的环境中进行彻底测试和验证。