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

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

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

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

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

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

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

joe:joes_password (имя пользователя:пароль) или
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (key:secret)

получается что-то вроде:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

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

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

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

  • Для генерации токена доступа OAuth на основе учетных данных клиента вызовите API-прокси 1. Обработка этого процесса осуществляется политикой OAuth v2.0 на API-прокси.
  • Для отправки токена доступа OAuth в вызове API используйте API-прокси 2. API-прокси проверяет токен доступа, используя политику OAuth версии 2.0.

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

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

Загрузите и разверните прокси-сервер API для генерации токенов.

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

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

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

Отлично! Вы успешно загрузили и развернули API-прокси для генерации токенов доступа в вашей организации Edge.

Ознакомьтесь с алгоритмом и политикой аутентификации OAuth.

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

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

    В представлении 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.

О «фиктивной мишени»

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

http://mocktarget.apigee.net/ip

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

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

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

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

  1. В левой панели навигации выберите «Разработка» > «API-прокси» .
  2. Click + Proxy .
    Кнопка «Создать прокси»
  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-прокси был успешно создан и развернут в вашей тестовой среде.
  11. Нажмите «Редактировать прокси» , чтобы отобразить страницу обзора API-прокси.
    Обратите внимание, что на этот раз API-прокси развертывается автоматически. Щелкните раскрывающийся список «Развертывание», чтобы убедиться, что рядом со средой «тестирование» стоит зеленая точка развертывания.

Ознакомьтесь с правилами

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

  1. В редакторе API-прокси перейдите на вкладку «Разработка» . Вы увидите, что в поток запросов API-прокси добавлены две политики:
    • Проверка токена доступа OAuth v2.0 – проверяет вызов API, чтобы убедиться в наличии действительного токена OAuth.
    • Удаление заголовка Authorization – политика 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 . Operation определяет, что должна делать политика. В данном случае она будет проверять наличие действительного токена OAuth в запросе.

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

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

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

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

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

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

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

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

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

Зарегистрируйте приложение

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

  1. Выберите «Опубликовать» > «Приложения» .
  2. Click + App .
  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 к импортированному вами примеру прокси-сервера 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 , то нужно выполнить политику OAuth GenerateAccessTokenClient , которая генерирует токен доступа? Ваша команда 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 в вызов.

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