Переадресация запросов в региональный API на основе конкретной заявки JWT - PullRequest
0 голосов
/ 07 февраля 2019

Можно ли перенаправлять запросы в региональный API на основе конкретной заявки JWT?

Платформа, на которой я работаю, имеет один API на регион, и наши клиенты должны знать его для построениябазовый URL-адрес запроса, например: https://{region}.service.com

К сожалению, единственный надежный способ попытаться выяснить, какой региональный API-интерфейс будет вызываться автоматически из Azure APIM (например, в нашем сценарии вызов одной конечной точки на https://api.service.com),), было бы путем анализа заявки, которая всегда идет с токеном на предъявителя (который мы уже делаем на уровне APIM .)

Кто-нибудь имел необходимость сделать это таким образом? Спасибо взаранее!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Ответ Виталия был ключом к выяснению этого.Вот полный ответ, если кто-то ищет то же самое.

<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>
0 голосов
/ 11 февраля 2019

Выражения политики APIM вместе с политикой «выбирать» позволяют вам создавать произвольную логику обработки: https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions.

Доступ к JWT доступен как

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

Возвращает объект Jwt (смотритедля его свойств на той же странице выше).

Все это в сочетании с политикой "set-backend-service" должно быть достаточным для выполнения этой работы.

...