Как защитить 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. На панели навигации слева выберите Develop > API Proxies (Разработка > Прокси API).
  4. Нажмите + Прокси.
    Кнопка "Создать прокси"
  5. В мастере Создание прокси-сервера нажмите Загрузить пакет прокси-сервера.
  6. Выберите скачанный файл oauth.zip и нажмите Далее.
  7. Нажмите Создать.
  8. После завершения сборки нажмите Изменить прокси, чтобы посмотреть новый прокси в редакторе прокси API.
  9. На странице Overview (Обзор) редактора прокси API нажмите на раскрывающееся меню Deployment (Развертывание) и выберите test (тест). Это тестовая среда в вашей организации.

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

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

Как посмотреть поток OAuth и правила

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

  1. В редакторе прокси-сервера API нажмите на вкладку Разработка. На панели Navigator слева вы увидите два правила. В разделе Proxy Endpoints также будут представлены два потока POST.
  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> – одно из нескольких предопределенных значений, которое определяет, что будет делать правило. В этом случае оно будет генерировать токен доступа.
    • Срок действия токена истекает через час (3 600 000 миллисекунд) после создания.
    • В <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

Сервис 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. На панели навигации слева выберите Develop > API Proxies (Разработка > Прокси API).
  2. Нажмите + Прокси.
    Кнопка &quot;Создать прокси&quot;
  3. В мастере Build a Proxy (Создание прокси-сервера) выберите Reverse proxy (most common) (Обратный прокси-сервер (наиболее распространенный)) и нажмите Next (Далее).
  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. На странице Build (Создать) убедитесь, что выбран тестовый режим, и нажмите Create and Deploy (Создать и развернуть).
  10. На странице Summary (Сводка) вы увидите подтверждение того, что новый прокси-сервер API создан и развернут в тестовой среде.
  11. Нажмите Edit proxy (Изменить прокси), чтобы открыть страницу Overview (Обзор) для прокси-сервера API.
    Обратите внимание, что на этот раз прокси-сервер API развертывается автоматически. Нажмите на раскрывающийся список "Развертывание" и убедитесь, что рядом с тестовой средой есть зеленый значок развертывания.

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

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

  1. В редакторе прокси-сервера API нажмите на вкладку Разработка. Вы увидите, что в поток запросов прокси-сервера API добавлены два правила:
    • Проверка токена доступа OAuth 2.0 – проверяет вызов API, чтобы убедиться в наличии действительного токена OAuth.
    • Удалить заголовок авторизации – правило AssignMessage, которое удаляет токен доступа после его проверки, чтобы он не передавался целевой службе. (Если целевому сервису нужен токен доступа OAuth, это правило не используется.)
  2. Нажмите на значок Verify OAuth v2.0 Access Token (Проверить токен доступа OAuth 2.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. Выберите Publish (Опубликовать) > API Products (Продукты API).
  2. Нажмите + Продукт API.
  3. Введите сведения о продукте для продукта API.
    Поле Описание
    Название Внутреннее название продукта API. Не используйте в названии специальные символы.
    Примечание. После создания продукта API его название изменить нельзя. Пример: helloworld_oauth2-Product
    Отображаемое название Отображаемое название продукта API. Отображаемое название используется в интерфейсе. Его можно изменить в любое время. Если не указано, будет использоваться значение поля "Название". Это поле заполняется автоматически на основе значения поля "Название". Вы можете изменить или удалить его содержимое. Отображаемое имя может содержать специальные символы. например helloworld_oauth2-Product (2-е издание).
    Описание Описание продукта API.
    Среда Среды, к которым будет разрешен доступ с помощью продукта API. Выберите среду, в которой развернут прокси-сервер API. например test (2-е издание).
    Доступ Выберите Общедоступные.
    Как автоматически одобрять запросы на доступ Включите автоматическое одобрение запросов ключей для этого продукта 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, который был создан автоматически ранее.

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

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

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

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

Поскольку прокси-сервер API имеет правило Verify OAuth v2.0 Access Token, проверяющее наличие действительного токена 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, то нужно выполнить правило OAuth GenerateAccessTokenClient, которое генерирует токен доступа? Ваша команда cURL соответствовала этим условиям, поэтому были применены правила OAuth. Он проверил ваш идентификатор клиента и секретный ключ клиента и обменял их на токен OAuth, срок действия которого истекает через час.

Вызов 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.

Статьи по теме