Защитите API с помощью OAuth

Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X.
информация

Что вы узнаете

  • Загрузите и разверните образец прокси-сервера API.
  • Создайте прокси-сервер API, защищенный OAuth.
  • Создайте продукт, разработчика и приложение.
  • Обмен учетными данными для токена доступа OAuth.
  • Вызовите API с токеном доступа.

В этом руководстве показано, как защитить API с помощью OAuth 2.0.

OAuth — это протокол авторизации, который позволяет приложениям получать доступ к информации от имени пользователей, не требуя от пользователей раскрывать свое имя пользователя и пароль.

При использовании OAuth учетные данные безопасности (например, имя пользователя/пароль или ключ/секрет) заменяются на токен доступа. Например:

joe:joes_password (имя пользователя:пароль) или
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (ключ:секретный)

становится чем-то вроде:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

Маркер доступа представляет собой случайную строку символов и является временным (его срок действия должен истечь через относительно короткое время), поэтому его передача для аутентификации пользователя в рабочем процессе приложения гораздо безопаснее, чем передача реальных учетных данных.

Спецификация OAuth 2.0 определяет различные механизмы, называемые «типами предоставления», для распространения токенов доступа для приложений. Самый основной тип предоставления, определенный OAuth 2.0, называется «учетные данные клиента». В этом типе предоставления токены доступа OAuth генерируются в обмен на учетные данные клиента, которые представляют собой пары ключ потребителя/секрет потребителя, как в примере выше.

Тип предоставления учетных данных клиента в Edge реализуется с использованием политик в прокси-серверах API. Типичный вход OAuth включает два этапа:

  • Вызовите прокси-сервер API 1 , чтобы сгенерировать токен доступа OAuth на основе учетных данных клиента. Это решается политикой OAuth v2.0 на прокси-сервере API.
  • Вызовите прокси-сервер API 2 , чтобы отправить токен доступа OAuth в вызове API. Прокси-сервер API проверяет токен доступа с помощью политики OAuth версии 2.0.

Что вам понадобится

  • Учетная запись Apigee Edge. Если у вас его еще нет, вы можете зарегистрироваться, следуя инструкциям в разделе «Создание учетной записи Apigee Edge» .
  • cURL установлен на вашем компьютере для выполнения вызовов API из командной строки.

Загрузите и разверните прокси-сервер API, генерирующий токены.

На этом этапе вы создадите прокси-сервер API, который генерирует токен доступа OAuth на основе ключа потребителя и секрета потребителя, отправленных в вызове API. Apigee предоставляет пример прокси-сервера API, который делает это. Сейчас вы загрузите и развернете прокси-сервер, а затем будете использовать его позже в этом руководстве. (Вы можете легко создать этот прокси-сервер API самостоятельно. Этот шаг загрузки и развертывания предназначен для удобства и для того, чтобы показать вам, как легко делиться уже созданными прокси-серверами.)

  1. Загрузите ZIP-файл прокси-сервера API oauth в любой каталог вашей файловой системы.
  2. Перейдите на https://apigee.com/edge и войдите в систему.
  3. Выберите «Разработка» > «Прокси API» на левой панели навигации.
  4. Нажмите + Прокси .
    Кнопка создания прокси
  5. В мастере создания прокси нажмите « Загрузить пакет прокси» .
  6. Выберите загруженный файл oauth.zip и нажмите «Далее» .
  7. Нажмите Создать .
  8. После завершения сборки нажмите «Редактировать прокси» , чтобы просмотреть новый прокси в редакторе прокси API.
  9. На странице «Обзор редактора прокси-сервера API» щелкните раскрывающийся список «Развертывание» и выберите «test» . Это тестовая среда в вашей организации.

    В запросе подтверждения нажмите « Развернуть» .
    При повторном щелчке раскрывающегося списка «Развертывание» зеленый значок указывает на то, что прокси-сервер развернут в тестовой среде.

Так держать! Вы успешно загрузили и развернули прокси-сервер API, генерирующий токены доступа, в своей организации Edge.

Просмотр потока и политики OAuth

Давайте подробнее рассмотрим, что содержит API-прокси.

  1. В редакторе прокси API перейдите на вкладку «Разработка» . В левой панели навигатора вы увидите две политики. Вы также увидите два потока POST в разделе Proxy Endpoints .
  2. Нажмите AccessTokenClientCredential в разделе Proxy Endpoints .

    В представлении XML-кода вы увидите Flow под названием AccessTokenClientCredential :

    <Flow name="AccessTokenClientCredential">
        <Description/>
        <Request>
            <Step>
                <Name>GenerateAccessTokenClient</Name>
            </Step>
        </Request>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/accesstoken") and (request.verb = "POST")</Condition>
    </Flow>

    Поток — это этап обработки в прокси-сервере API. В этом случае поток запускается при выполнении определенного условия (он называется условным потоком ). Условие, определенное в элементе <Condition> , гласит, что если вызов прокси-сервера API выполняется к ресурсу /accesstoken , а команда запроса — POST , то выполняется политика GenerateAccessTokenClient , которая генерирует токен доступа.

  3. Теперь давайте посмотрим на политику, которую будет запускать условный поток. Щелкните значок политики GenerateAccessTokenClient на блок-схеме.

    Следующая конфигурация XML загружается в представление кода:

    <OAuthV2 name="GenerateAccessTokenClient">
        <!-- This policy generates an OAuth 2.0 access token using the client_credentials grant type -->
        <Operation>GenerateAccessToken</Operation>
        <!-- This is in millseconds, so expire in an hour -->
        <ExpiresIn>3600000</ExpiresIn>
        <SupportedGrantTypes>
            <!-- This part is very important: most real OAuth 2.0 apps will want to use other
             grant types. In this case it is important to NOT include the "client_credentials"
             type because it allows a client to get access to a token with no user authentication -->
            <GrantType>client_credentials</GrantType>
        </SupportedGrantTypes>
        <GrantType>request.queryparam.grant_type</GrantType>
        <GenerateResponse/>
    </OAuthV2>

    Конфигурация включает в себя следующее:

    • <Operation> , который может быть одним из нескольких предопределенных значений, определяет, что будет делать политика. В этом случае он будет генерировать токен доступа.
    • Срок действия токена истекает через 1 час (3600000 миллисекунд) после создания.
    • В <SupportedGrantTypes> ожидается использование OAuth <GrantType>client_credentials (обмен потребительского ключа и секрета на токен OAuth).
    • Второй элемент <GrantType> сообщает политике, где искать в вызове API параметр типа предоставления, как того требует спецификация OAuth 2.0. (Вы увидите это позже при вызове API). Тип гранта также может быть отправлен в HTTP-заголовке ( request.header.grant_type ) или как параметр формы ( request.formparam.grant_type ).

На данный момент вам больше ничего делать с прокси-сервером API не нужно. На следующих этапах вы будете использовать этот прокси-сервер API для создания токена доступа OAuth. Но сначала вам нужно сделать еще несколько вещей:

  • Создайте прокси-сервер API, который вы действительно хотите защитить с помощью OAuth.
  • Создайте еще несколько артефактов, в результате которых вы получите потребительский ключ и потребительский секрет, которые необходимо обменять на токен доступа.

Создайте прокси-сервер API, защищенный OAuth.

О «ложной цели»

Служба макета размещена в Apigee и возвращает простые данные. Фактически, вы можете получить к нему доступ в веб-браузере. Попробуйте это, нажав следующее:

http://mocktarget.apigee.net/ip

Цель возвращает то, что вы должны увидеть, когда в конечном итоге вызовете этот прокси-сервер API.

Вы также можете нажать http://mocktarget.apigee.net/help , чтобы просмотреть другие ресурсы API, доступные в макете.

Теперь вы создадите прокси-сервер API, который хотите защитить. Это вызов API, который возвращает то, что вы хотите. В этом случае прокси-сервер API вызовет службу ложных целей Apigee, чтобы вернуть ваш IP-адрес. НО, вы сможете увидеть это, только если передадите действительный токен доступа OAuth с вызовом API.

Прокси-сервер API, который вы создаете здесь, будет включать политику, которая проверяет наличие токена OAuth в запросе.

  1. Выберите «Разработка» > «Прокси API» на левой панели навигации.
  2. Нажмите + Прокси .
    Кнопка создания прокси
  3. В мастере создания прокси выберите «Обратный прокси-сервер (наиболее распространенный)» и нажмите «Далее» .
  4. Настройте прокси следующим образом:
    В этой области сделай это
    Имя прокси Введите: helloworld_oauth2
    Базовый путь проекта

    Измените на: /hellooauth2

    Базовый путь проекта — это часть URL-адреса, используемого для запросов к прокси-серверу API.

    Существующий API

    Введите: https://mocktarget.apigee.net/ip .

    Это определяет целевой URL-адрес, который Apigee Edge вызывает при запросе к прокси-серверу API.

    Описание Введите: hello world protected by OAuth
  5. Нажмите Далее .
  6. На странице Общие политики :
    В этой области сделай это
    Безопасность: Авторизация Выберите: OAuth 2.0.
  7. Нажмите Далее .
  8. На странице «Виртуальные хосты» нажмите «Далее» .
  9. На странице «Сборка» убедитесь, что выбрана тестовая среда, и нажмите « Создать и развернуть» .
  10. На странице «Сводка» вы увидите подтверждение того, что ваш новый прокси-сервер API был успешно создан и что прокси-сервер API был развернут в вашей тестовой среде.
  11. Нажмите «Редактировать прокси» , чтобы отобразить страницу «Обзор» прокси-сервера API.
    Обратите внимание, что на этот раз прокси-сервер API развертывается автоматически. Щелкните раскрывающийся список «Развертывание», чтобы убедиться, что рядом с «тестовой» средой есть зеленая точка развертывания.

Посмотреть правила

Давайте поближе посмотрим на то, что вы создали.

  1. В редакторе прокси API перейдите на вкладку «Разработка» . Вы увидите, что в поток запросов прокси API были добавлены две политики:
    • Проверить токен доступа OAuth v2.0 — проверяет вызов API, чтобы убедиться в наличии действующего токена OAuth.
    • Удалить авторизацию заголовка — политика AssignMessage, которая удаляет токен доступа после его проверки, чтобы он не передавался целевой службе. (Если целевой службе нужен токен доступа OAuth, вы не будете использовать эту политику).
  2. Щелкните значок «Проверить токен доступа OAuth v2.0» в представлении потока и просмотрите XML-код под ним на панели кода.

    <OAuthV2 async="false" continueOnError="false" enabled="true" name="verify-oauth-v2-access-token">
        <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
        <Operation>VerifyAccessToken</Operation>
    </OAuthV2>

    Обратите внимание, что <Operation> — это VerifyAccessToken . Операция определяет, что должна делать политика. В этом случае он проверит наличие в запросе действующего токена OAuth.

Добавить продукт API

Чтобы добавить продукт API с помощью пользовательского интерфейса Apigee:

  1. Выберите «Опубликовать» > «Продукты API» .
  2. Нажмите +API-продукт .
  3. Введите сведения о продукте для вашего продукта API.
    Поле Описание
    Имя Внутреннее имя продукта API. Не указывайте в имени специальные символы.
    Примечание. Вы не сможете редактировать имя после создания продукта API. Например, helloworld_oauth2-Product
    Отображаемое имя Отображаемое имя продукта API. Отображаемое имя используется в пользовательском интерфейсе, и вы можете редактировать его в любое время. Если не указано, будет использоваться значение Name. Это поле заполняется автоматически с использованием значения «Имя»; вы можете редактировать или удалять его содержимое. Отображаемое имя может включать специальные символы. Например, helloworld_oauth2-Product .
    Описание Описание продукта API.
    Среда Среды, к которым продукт API разрешит доступ. Выберите среду, в которой вы развернули прокси-сервер API. Например, test .
    Доступ Выберите Публичный .
    Автоматически утверждать запросы на доступ Включите автоматическое одобрение запросов ключей для этого продукта API из любого приложения.
    Квота Игнорировать для этого урока.
    Разрешенные области действия OAuth Игнорировать для этого урока.
  4. В поле «Прокси API» выберите только что созданный прокси API.
  5. В поле Путь введите «/». Не обращайте внимания на другие поля.
  6. Нажмите Сохранить .

Добавьте разработчика и приложение в свою организацию

Далее вы смоделируете рабочий процесс регистрации разработчика для использования ваших API. В идеале разработчики регистрируют себя и свои приложения через ваш портал разработчиков. Однако на этом этапе вы добавите разработчика и приложение в качестве администратора.

У разработчика будет одно или несколько приложений, которые вызывают ваши API, и каждое приложение получает уникальный ключ потребителя и секрет потребителя. Этот ключ/секрет для каждого приложения также дает вам, поставщику API, более детальный контроль над доступом к вашим API и более подробные аналитические отчеты о трафике API, поскольку Edge знает, какой разработчик и приложение принадлежат какому токену OAuth.

Создать разработчика

Давайте создадим разработчика по имени Найджел Тафнел.

  1. В меню выберите «Опубликовать» > «Разработчики» .
  2. Нажмите + Разработчик .
  3. Введите следующее в окне «Новый разработчик» :
    В этой области Входить
    Имя Nigel
    Фамилия Tufnel
    Имя пользователя nigel
    Электронная почта nigel@example.com
  4. Нажмите Создать .

Зарегистрировать приложение

Давайте создадим приложение для Найджела.

  1. Выберите «Опубликовать» > «Приложения» .
  2. Нажмите + Приложение .
  3. Введите следующее в окне «Новое приложение» :
    В этой области сделай это
    Имя и отображаемое имя Введите: nigel_app
    Разработчик Нажмите «Разработчик» и выберите: Nigel Tufnel (nigel@example.com)
    URL обратного вызова и примечания Оставьте пустым
  4. В разделе «Продукты» нажмите «Добавить продукт» .
  5. Выберите helloworld_oauth2-Product .
  6. Нажмите Создать .

Получите потребительский ключ и потребительский секрет

Теперь вы получите потребительский ключ и потребительский секрет, которые будут обменены на токен доступа OAuth.

  1. Убедитесь, что страница nigel_app отображается. Если нет, на странице «Приложения» («Опубликовать» > «Приложения») нажмите nigel_app .
  2. На странице nigel_app нажмите «Показать» в столбцах «Ключ» и «Секрет» . Обратите внимание, что ключ/секрет связаны с «helloworld_oauth2-Product», который был автоматически создан ранее.

  3. Выберите и скопируйте Ключ и Секрет. Вставьте их во временный текстовый файл . Вы будете использовать их на следующем этапе, когда вызовете прокси-сервер API, который заменит эти учетные данные на токен доступа OAuth.

Попробуйте вызвать API, чтобы получить ваш IP-адрес (не удалось!)

Просто ради интереса попробуйте вызвать защищенный прокси-сервер API, который должен возвращать ваш IP-адрес. Выполните следующую команду cURL в окне терминала, заменив имя вашей организации Edge. Слово test в URL-адресе означает тестовую среду вашей организации, в которой вы развернули свои прокси. Базовый путь прокси — /hellooauth2 — тот же базовый путь, который вы указали при создании прокси. Обратите внимание, что вы не передаете токен доступа OAuth при вызове.

curl https://ORG_NAME-test.apigee.net/hellooauth2

Поскольку прокси-сервер API имеет политику проверки токена доступа OAuth v2.0, проверяющую действительный токен OAuth в запросе, вызов должен завершиться ошибкой со следующим сообщением:

{"fault":{"faultstring":"Invalid access token","detail":{"errorcode":"oauth.v2.InvalidAccessToken"}}}

В этом случае неудача – это хорошо! Это означает, что ваш прокси-сервер API намного безопаснее. Только доверенные приложения с действительным токеном доступа OAuth могут успешно вызывать этот API.

Получите токен доступа OAuth

Теперь мы подошли к большой выплате. Вы собираетесь использовать ключ и секрет, которые вы скопировали и вставили в текстовый файл, и обменять их на токен доступа OAuth. Теперь вы собираетесь выполнить вызов API к импортированному вами образцу прокси-сервера API, oauth , который сгенерирует токен доступа к API.

Используя этот ключ и секрет, выполните следующий вызов cURL (обратите внимание, что протокол https ), заменив имя вашей организации Edge, свой ключ и свой секрет там, где указано:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
"https://ORG_NAME-test.apigee.net/oauth/client_credential/accesstoken?grant_type=client_credentials" \
-d "client_id=CLIENT_KEY&client_secret=CLIENT_SECRET"

Обратите внимание: если вы используете для вызова такой клиент, как Postman, client_id и client_secret идут в теле запроса и должны быть x-www-form-urlencoded .

Вы должны получить такой ответ:

{
  "issued_at" : "1466025769306",
  "application_name" : "716bbe61-f14a-4d85-9b56-a62ff8e0d347",
  "scope" : "",
  "status" : "approved",
  "api_product_list" : "[helloworld_oauth2-Product]",
  "expires_in" : "3599", //--in seconds
  "developer.email" : "nigel@example.com",
  "token_type" : "BearerToken",
  "client_id" : "xNnREu1DNGfiwzQZ5HUN8IAUwZSW1GZW",
  "access_token" : "GTPY9VUHCqKVMRB0cHxnmAp0RXc0",
  "organization_name" : "myOrg",
  "refresh_token_expires_in" : "0", //--in seconds
  "refresh_count" : "0"
}

Вы получили токен доступа OAuth! Скопируйте значение access_token (без кавычек) и вставьте его в текстовый файл. Вы воспользуетесь им через мгновение.

Что только что произошло?

Помните, ранее вы рассматривали этот условный поток в прокси-сервере oauth , который говорил, что если URI ресурса — /accesstoken , а команда запроса — POST , то необходимо выполнить политику GenerateAccessTokenClient OAuth, которая генерирует токен доступа? Ваша команда cURL соответствовала этим условиям, поэтому политика OAuth была выполнена. Он проверил ваш потребительский ключ и потребительский секрет и заменил их на токен OAuth, срок действия которого истекает через 1 час.

Вызов API с токеном доступа (успех!)

Теперь, когда у вас есть токен доступа, вы можете использовать его для вызова прокси-сервера API. Сделайте следующий вызов cURL. Замените имя организации Edge и токен доступа.

curl https://ORG_NAME-test.apigee.net/hellooauth2 -H "Authorization: Bearer TOKEN"

Теперь вы должны получить успешный вызов прокси-сервера API, который возвращает ваш IP-адрес. Например:

{"ip":"::ffff:192.168.14.136"}

Вы можете повторять этот вызов API около часа, после чего срок действия токена доступа истечет. Чтобы позвонить через час, вам нужно будет создать новый токен доступа, выполнив предыдущие шаги.

Поздравляем! Вы создали прокси-сервер API и защитили его, потребовав включения в вызов допустимого токена доступа OAuth.

Связанные темы