【问题标题】:How to forward query parameters to external identity provider using Keycloak?如何使用 Keycloak 将查询参数转发给外部身份提供者?
【发布时间】:2020-12-07 15:50:11
【问题描述】:

在 Keycloak 中创建身份提供者 (IdP) 时,有一个选项可用于将查询参数转发到外部 IdP。我该如何使用它?

我想将 launch 参数转发给外部 IdP。我在 Keycloak 配置页面的Forwarded Query Parameters 字段中提到了launch。我在我的locahost:9090 上使用受 Keyclaok 保护的应用程序。当我访问http://localhost:9090?launch=abc 时,此参数不会转发到外部 IdP。我将 keycloak-spring-boot-starter 用于我们的 Spring Boot 应用程序。

同样来自code of Keycloak,我看到转发参数附加了一些前缀,即client_request_param_,所以我尝试使用http://localhost:9090?client_request_param_launch=abc,但没有运气。

AuthorizationEndpoint.LOGIN_SESSION_NOTE_ADDITIONAL_REQ_PARAMS_PREFIX = client_request_param_

String forwardParameterConfig = getConfig().getForwardParameters() != null ? getConfig().getForwardParameters(): "";
List<String> forwardParameters = Arrays.asList(forwardParameterConfig.split("\\s*,\\s*"));
for(String forwardParameter: forwardParameters) {
    String name = AuthorizationEndpoint.LOGIN_SESSION_NOTE_ADDITIONAL_REQ_PARAMS_PREFIX + forwardParameter.trim();
    String parameter = request.getAuthenticationSession().getClientNote(name);
    if(parameter != null && !parameter.isEmpty()) {
        uriBuilder.queryParam(forwardParameter, parameter);
    }
}

P.S:我使用的是 Keycloak 7.0.0。

【问题讨论】:

    标签: oauth keycloak openid-connect identity


    【解决方案1】:

    我在授权请求中设置 acr_values parameters 时遇到了同样的问题。我通过将参数直接放在授权端点路径中来解决它:

    https://YOUR_DOMAIN/oauth/authorize?acr_values=MY_VALUES&
    

    我没有进行太多调查,为什么 Forwarded Query Parameter 没有按预期工作(我使用的是 Keycloak 14.0.0)。很高兴看到有人稍后在这里给出一些解释。

    【讨论】:

      【解决方案2】:

      以防万一有人遇到这种情况。正如在source code 中实现的那样,处理附加查询参数的最大限制为 5 个附加查询参数(声明为常量:ADDITIONAL_REQ_PARAMS_MAX_MUMBER)。

      额外的查询参数被排除在声明的已知请求参数的子集中(KNOWN_REQ_PARAMS 声明为here)。

      例子,

      https://<domain>/openid-connect/auth?
      
      scope=xx
      
      &response_type=code
      
      &client_id=xxx
      
      &redirect_uri=xxx
      
      &state=xxx
      
      &addParam1=xx
      
      &addParam2=xx
      
      &addParam3=xx
      
      &addParam4=xx
      
      &addParam5=xx
      
      &addParam6=xx (not processed)
      
      &addParam7=xx (not processed)
      

      参考source code,extractAdditionalReqParams 方法只会处理到 addParam5 并在之后停止。

      【讨论】:

        【解决方案3】:

        我猜测转发的查询参数是附加到初始代码流请求的 NON-OIDC 参数 - 如果在该 IdP 的列表中指定,这些参数随后被转发到 IdP。

        【讨论】:

          猜你喜欢
          • 2017-12-27
          • 2020-09-24
          • 2018-09-23
          • 1970-01-01
          • 2020-03-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-21
          • 2019-07-20
          相关资源
          最近更新 更多