场景 AuthorizationCode

使用用户名和密码登录用户并交换身份验证代码。

有关所有场景的列表,请参阅 场景概览

场景步骤

  1. 打开登录页面。

  2. 使用用户名和密码登录。

  3. 交换身份验证代码以获取令牌。

  4. 给定的概率注销。

有关详细信息,请参阅 AuthorizationCode.scala 中的源代码。

由于 issue #945 中描述的情况,此场景不适用于非 TLS localhost URL,例如 https://#http://127.0.0.1 或类似地址。 请改为使用其他接口的 IP 地址,或 http://0.0.0.0,或者使用 TLS 证书运行 Keycloak。

运行示例场景

先决条件

  • Keycloak 正在运行。

  • Realm、用户和客户端存在,其值在 CLI 上列出。

  • 客户端需要启用客户端身份验证,这将导致 OIDC 类型的机密访问类型,因为机密客户端密钥用于授权码交换。

  • 此场景不需要为客户端设置任何服务帐户角色。

有关如何为 realm 和客户端自动执行此操作的详细信息,请参阅 准备 Keycloak 以进行测试

运行场景

以下场景使用默认设置运行 30 秒。

有关其他 CLI 选项,请参阅 配置基准测试

bin/kcb.sh \
  --scenario=keycloak.scenario.authentication.AuthorizationCode \
  --server-url=http://0.0.0.0:8080/ \
  --realm-name=realm-0 \
  --username=user-0 \
  --user-password=user-0-password \
  --client-id=client-0 \
  --client-secret=client-0-secret \
  --client-redirect-uri=http://0.0.0.0:8080 \
  --log-http-on-failure

变体

要创建离线会话,请将参数 --scope 设置为包含 offline_access 的值,例如 openid profile offline_access

要测试在身份验证和注销之间重复刷新令牌,请传递 --refresh-token-count=<count>--refresh-token-period=<seconds>。 默认情况下,它将关闭 HTTP 连接,以便下一个请求需要建立新连接,从而模拟客户端的行为,在客户端中,令牌刷新通常在先前与 Keycloak 的连接已过期后发生。 通过添加选项 --refresh-close-http-connection=false 来更改此行为。

错误消息

无效参数:redirect_uri

这可能有以下原因

  • 具有给定客户端 ID 的客户端在给定 realm 中不存在或已被错误输入。

    补救措施: 检查在命令行上给出的或作为默认值的客户端 ID 是否存在于给定的 realm 中。

  • 重定向 URI 与客户端中配置的重定向 URI 不匹配。

    补救措施: 检查在命令行上给出的或作为默认值的重定向 URI 是否与客户端中的重定向 URI 匹配。

无效的用户名或密码

可以通过尝试在 https://{keyloak-server}/realms/{realm}/account/ 的帐户控制台上以用户身份登录来手动测试。 这可能有以下原因

  • 具有给定用户名的用户不存在。

    补救措施: 检查在命令行上给出的或作为默认值的用户是否存在于给定的 realm 中。

  • 用户拥有不同的密码。

    补救措施: 检查用户是否设置了正确的密码。

scope 的参数值无效

scope 参数中列出了一个未知的 scope。

检查客户端的所有 scope 是否在客户端的“客户端 scopes”选项卡中作为默认 scope 或可选 scope 存在。 作为参数给出的 scope 可能不存在或存在拼写错误。

进一步阅读