Политика токенов JWT для управления API Azure

#azure-api-management #jwt-auth

#azure-api-management #jwt

Вопрос:

Я пытаюсь настроить политику для JWT на портале Azure, и я искал и вставлял почти все решения, доступные в сети, но, похоже, ни одно из них не работает. Здесь есть политика, которую я настроил:-

 <policies>
   <inbound>
      <validate-jwt header-name="Authorization" require-scheme="Bearer">
         <issuer-signing-keys>
            <key>X3IwT3A3bkVfZn40aHkueTBuX2lWd0J6OWNsMjI2Uk9WZw==</key>
         </issuer-signing-keys>
         <decryption-keys>
            <key>X3IwT3A3bkVfZn40aHkueTBuX2lWd0J6OWNsMjI2Uk9WZw==</key>
         </decryption-keys>
         <audiences>
            <audience>api://53cd59c4-53e7-46e6-890b-1dcac2cb2423</audience>
         </audiences>
         <issuers>
            <issuer>https://sts.windows.net/5181d074-dbc6-49e9-9ada-051bc62d5e3e/</issuer>
         </issuers>
         <required-claims>
            <claim name="scope" match="any" separator=" ">
               <value>Files.Read</value>
            </claim>
         </required-claims>
      </validate-jwt>
   </inbound>
   <backend>
      <base />
   </backend>
   <outbound>
      <base />
   </outbound>
   <on-error>
      <base />
   </on-error>
</policies>
  

Запрос:

 GET https://insyncapim.azure-api.net/api/Product/api/Product HTTP/1.1
Host: insyncapim.azure-api.net
Authorization: Bearer {my JWT token}
Ocp-Apim-Subscription-Key: ••••••••••••••••••••••••••••••••
Ocp-Apim-Trace: true
  

ответ:

 content-length: 85
content-type: application/json
date: Thu, 12 Nov 2020 09:13:53 GMT
ocp-apim-trace-location: https://apimstu4tludl9hfaq8f2v6o.blob.core.windows.net/apiinspectorcontainer/wEGj7uZ8ebXmIo1P1hgGvw2-16?sv=2018-03-28amp;sr=bamp;sig=sQ98cMJe58d6bJcmZ+RqGHtn6jk6S13p7ORbFlWkIwI=amp;se=2020-11-13T09:13:53Zamp;sp=ramp;traceId=3f4870770f544ed28962360a04112ef8
vary: Origin
{
    "statusCode": 401,
    "message": "Unauthorized. Access token is missing or invalid."
}
  

трассировка:

 api-inspector
{
    "request": {
        "method": "GET",
        "url": "https://insyncapim.azure-api.net/api/Product/api/Product",
        "headers": [
            {
                "name": "Ocp-Apim-Subscription-Key",
                "value": {My subscription key}
            },
            {
                "name": "Sec-Fetch-Site",
                "value": "cross-site"
            },
            {
                "name": "Sec-Fetch-Mode",
                "value": "cors"
            },
            {
                "name": "Sec-Fetch-Dest",
                "value": "empty"
            },
            {
                "name": "X-Forwarded-For",
                "value": "182.75.240.158"
            },
            {
                "name": "Cache-Control",
                "value": "no-cache, no-store"
            },
            {
                "name": "Content-Type",
                "value": "text/plain;charset=UTF-8"
            },
            {
                "name": "Accept",
                "value": "*/*"
            },
            {
                "name": "Accept-Encoding",
                "value": "gzip,deflate,br"
            },
            {
                "name": "Accept-Language",
                "value": "en-US,en;q=0.9"
            },
            {
                "name": "Authorization",
                "value": "Bearer {my JWT token}
            },
            {
                "name": "Host",
                "value": "insyncapim.azure-api.net"
            },
            {
                "name": "Referer",
                "value": "https://apimanagement.hosting.portal.azure.net/"
            }
        ]
    }
}

api-inspector
{
    "configuration": {
        "api": {
            "from": "/api/Product",
            "to": null,
            "version": null,
            "revision": "1"
        },
        "operation": {
            "method": "GET",
            "uriTemplate": "/api/Product"
        },
        "user": "-",
        "product": "-"
    }
}
  

И я пытаюсь сгенерировать токен доступа с помощью postman, токен доступа генерируется. Но всякий раз, когда я пытаюсь запросить API с использованием токена доступа, результат всегда 401: несанкционированный.
Я пробую это в первый раз, пожалуйста, помогите мне.

Комментарии:

1. Не могли бы вы поделиться подробностями о том, как вы сгенерировали токен доступа в postman? И этому api просто нужно Files.Read разрешение?

2. И не могли бы вы, пожалуйста, предоставить полную трассировку, местоположение которой было указано в Ocp-Apim-Trace-Location.

3. Привет @HuryShen, я получил все учетные данные из App Registration -> Demo App -> Endpoints. Затем в POSTMAN на вкладке авторизации я выбрал OAuth 2.0 -> Получить новый токен доступа. Токен доступа, созданный на этом шаге, используется для дальнейших запросов API. Я не смог получить какую-либо документацию, связанную с областью, в которой упоминаются допустимые области, и запрос токена доступа без области вызывал ошибку. Я смотрел видео на YouTube, в котором он использовал эту область, поэтому я использовал эту область.

4. Похоже, вы не знаете, в какой области содержится токен доступа. Вам необходимо знать, какие разрешения вы хотите назначить приложению в azure ad. Если вы уже назначили разрешение приложению, а также предоставили для него согласие администратора. Вы можете скопировать свой токен доступа на эту страницу и расшифровать токен. Затем проверьте, есть ли scope поле в декодированном токене. Я предполагаю, что в token может не существовать поля, поле может быть названо scp , но нет scope .

5. да, я расшифровал токен доступа, и он содержит — «scp»: «Файлы. Прочитать электронную почту OpenID профиля»,

Ответ №1:

У меня была та же проблема, которую я решил, сняв флажок Subscription required . Для этого перейдите по Your API management > APIs > Select your API's > Settings > Look for 'Subscription required' and uncheck it ссылке .

введите описание изображения здесь