按顺序从 IdP 检索最终用户信息

Retrieve end user information from IdP in a sequence

有一个遗留的 Rest 服务,它有自己的身份验证架构(self-owned 数据库存储用户信息并使用基本身份验证)。其他休息服务都使用 Keycloak 作为 IdP(以 OpenID 作为令牌)。

我正在尝试在遗留 Rest API 之前使用 WSO2 API 管理器,它可以像其他 api 服务一样使用 OpenID 对调用进行身份验证。我发现有一个指南说 how to pass the end user attributes to the back-end service and also how to pass a custom authorization token to the back-end service.

现在,我想知道是否可以按顺序检索呼叫者的 ID(即最终用户 ID)?这意味着我可以从 属性 中获取最终用户的 ID,对其进行修改,然后将其设置为 Authorization header.

因此,完整的过程如下:

  1. 最终用户从 Keycloak 生成 JWT 令牌
  2. 最终用户使用令牌
  3. 调用由API经理发布的api
  4. API 管理器检索最终用户的 userid 并将其设置到 Authorization header
  5. API 管理器使用更改后的 Authorization header
  6. 调用 back-end 服务

您可以尝试将以下序列作为 in-sequence 实现到您的 API。以下序列使用 Synapse 属性检索最终用户 ID 并将其分配给 Authorization Header.

<?xml version="1.0" encoding="UTF-8"?><sequence xmlns="http://ws.apache.org/ns/synapse" name="username-header">
    <property name="userid" expression="$ctx:api.ut.userName"/>
    <!-- property name="userid" expression="$ctx:api.ut.userId"/ -->
    <log level="custom">
        <property name="User ID" expression="$ctx:userid" />
    </log>

    <property name="Authorization" expression="$ctx:userid" scope="transport" action="set" />
</sequence>

此外,如果以上不能满足您的要求,您还可以尝试使用以下 Synapse 属性。

  • api.ut.username
  • api.ut.userId

如果您尝试从 API 管理器在 API 调用期间生成的后端 JWT 令牌中读取最终用户的 ID,则需要提出一个扩展的调解序列,读取并解码Token,然后提取信息。如果要求如上所述

,下面给出的是一个示例(不完整)
<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="admin--AssertionAPI:v1.0.0--In">
    <property name="assertion" expression="$trp:X-JWT-Assertion" />
    <log level="custom">
        <property name="Assertion" expression="$trp:X-JWT-Assertion" />
    </log>
    <property name="Body" expression="base64Decode(fn:substring-before(fn:substring-after($ctx:assertion, '.'), '.'))" />
    <log level="custom">
        <property name="body" expression="$ctx:Body" />
    </log>

    <!-- use script mediator to access required properties -->
    <!-- and set the value as a header -->
</sequence>