根据特定的JWT声明将请求转发到区域API

时间:2019-02-07 17:13:55

标签: azure azure-api-management

是否可以基于特定的JWT声明将请求转发到区域API?

我正在使用的平台每个区域有一个API,并且我们的客户必须知道该API才能构建基本请求URL-例如:https:// {region} .service.com

不幸的是,在我们的方案中,尝试找出要从Azure APIM自动调用哪个区域api的唯一可靠方法(例如:在https://api.service.com处调用单个终结点)将是通过分析一个始终附带令牌(我们已经做过at the APIM level。)

有人需要这样做吗?预先感谢!

2 个答案:

答案 0 :(得分:1)

APIM策略表达式以及“ choose”策略允许您创建任意处理逻辑:https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions

可以通过以下方式访问JWT

context.Request.Headers.GetValueOrDefault("Authorization").AsJwt()

它返回Jwt对象(在上面同一页面上查找它的属性)。

所有这些与“ set-backend-service”策略相结合就足以完成这项工作。

答案 1 :(得分:0)

维塔利的答案是弄清楚这一点的关键。如果有人在寻找相同的东西,这是完整的答案。

<policies>
    <inbound>
        <!-- Extract Token from Authorization header parameter -->
        <set-variable name="token" value="@(context.Request.Headers.GetValueOrDefault("Authorization",string.Empty).Split(' ').Last().AsJwt())" />
        <choose>
            <when condition="@(context.Variables["token"] != null)">
                <set-variable name="api_uri" value="@(((Jwt)context.Variables["token"]).Claims.GetValueOrDefault("api_uri", string.Empty))" />
                <choose>
                    <when condition="@(context.Variables["api_uri"] != string.Empty)">
                        <set-backend-service base-url="@((string)context.Variables["api_uri"])" />
                    </when>
                    <otherwise />
                </choose>
            </when>
            <otherwise />
        </choose>
        <base />
    </inbound>
</policies>