0

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

我正在尝试在旧版 Rest API 之前使用 WSO2 API 管理器,它可以像其他 api 服务一样使用 OpenID 对调用进行身份验证。我发现有一个指南说如何将最终用户属性传递给后端服务,以及如何将自定义授权令牌传递给后端服务

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

因此,完整的过程似乎是:

  1. 最终用户从 Keycloak 生成 JWT 令牌
  2. 最终用户使用令牌调用 API Manager 发布的 api
  3. API Manager 检索最终用户userid并将其设置到Authorization标头中
  4. AuthorizationAPI Manager 使用更改的标头调用后端服务
4

1 回答 1

1

您可以尝试将以下序列实现为 API 的顺序。以下序列使用 Synapse 属性检索最终用户 ID 并将其分配给Authorization标题。

<?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,则需要提出扩展的中介序列,读取和解码令牌,然后提取信息。如果要求如上所述,下面给出的是一个样本(不完整)

<?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>
于 2021-10-23T08:26:36.227 回答