Сбой проверки JWT управления API Azure - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь реализовать проверку JWT, как показано в этом видео .

Для этого я применил следующие политики:

<policies>
<inbound>
    <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="No auth" require-expiration-time="false" require-signed-tokens="false">
        <issuer-signing-keys>
            <key> base64key </key>
        </issuer-signing-keys>
    </validate-jwt>
    <return-response>
        <set-status code="200" reason="OK" />
        <set-body>test</set-body>
    </return-response>
    <base />
</inbound>
<backend>
    <base />
</backend>
<outbound>
    <base />
</outbound>
<on-error>
    <base />
</on-error>

require-подписанные токены и require-expiration-time будут включены в производство - я пытался отключить столько проверки, сколько смогу, просто чтобы запустить это.

Затем на JWT.io я генерирую токен: enter image description here

Тогда пришло время получить некоторые данные из API:

import urllib.request

headers = {"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNTM0MDAzOTk4In0.0DlazlR4-InCb-m0dBs-9BbPbyvu5s7Opr8uXIUaMdA"}
api_request = urllib.request.Request("https://someapi", headers=headers)
try:
    api_response = urllib.request.urlopen(api_request)
    print(api_response.read())
except urllib.error.HTTPError as e:
    print(e.read())

Обратите внимание, что заголовка Ocp-Apim-Subscription-Key нет, поскольку для продукта, содержащего API, подписка не требуется, вы также протестировали ее с ней. И результат:

b'{ "statusCode": 401, "message": "No auth" }'

Трассировка запроса API не предоставляет никакой полезной информации.

Есть что-нибудь очевидное, что я пропускаю?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Итак, благодаря комментарию ULR в Swikruti Bose я смог точно определить и устранить проблему. Оказывается, что трассировка на портале Azure не отображает всю доступную информацию. Чтобы быть конкретным: в нем отсутствует запись on-error .

После просмотра полной трассы, местоположение которой было указано в Ocp-Apim-Trace-Location заголовке ответа, я нашел этот маленький самородок:

Алгоритм: «HS256» требует, чтобы SecurityKey.KeySize был больше, чем «128» битов.

После предоставления более длинного ключа все работало как задумано.

Это то, что я получаю за ленивость при тестировании.

0 голосов
/ 22 мая 2019
  1. Я создаю следующие политики. Обратите внимание, что значение ключа должно быть Base64 string

<policies>
    <inbound>
        <base />
        <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="No auth" require-expiration-time="false">
            <issuer-signing-keys>
                <key>UGFzc3dvcmRraHNhZXJhdmJhZSdyZWp2dmFlcg==</key>
            </issuer-signing-keys>
        </validate-jwt>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
  1. Перейдите к https://jwt.io/ и создайте мой токен. Добавьте значение вашего ключа (мое - «UGFzc3dvcmRraHNhZXJhdmJhZSdyZWp2dmFlcg ==», которое является закодированным значением для Passwordkhsaeravbae'rejvvaer) к «your-256-bit-secret» и нажмите «секретный base6464 encoded»

enter image description here

Мой токен был:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyNDc1ODc4MzU3In0.oDLvHDYVMzVYNdwQ1gGE8-n_-tA_8I4DJ-8dWjlluR8
  1. В конце концов, мы можем проверить это с лазурного портала.

enter image description here

0 голосов
/ 26 июня 2018

Вам необходимо добавить "bearer" к значению заголовка Authorization, т.е.:

headers = {"Authorization": "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNTM0MDAzOTk4In0.0DlazlR4-InCb-m0dBs-9BbPbyvu5s7Opr8uXIUaMdA"}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...