Издевательства над поставщиками Oauth во время тестирования

У меня есть приложение, которое я пишу, который аутентифицируется на сервере авторизации Oauth 2.0. Я бы хотел проверить те части, которые доступны только после того, как вы вошли в систему, но сервер Oauth является внешней зависимостью, которая усложняет и делает хрупкие мои тесты.

Любые предложения о том, как я должен это делать? Что такое индустрия для чего-то подобного? Я чувствую себя как-то издеваться над сервером, чтобы он мог получить доступ к защищенным ресурсам.

В случае, если это имеет значение, это веб-приложение Python, написанное с использованием Flask.

Я использую собственный сервер oauth, который будет работать в моем собственном домене, и, хотя возможно добавить какую-то функциональность песочницы, как предложила FoxMask, я бы предпочел, чтобы она могла запускать тест, не требуя дополнительного запуска сервера.

Ответ 1

От стороны потребителя (т.е. вашего приложения) процесс OAuth2 можно разделить на две части:

  • перенаправление из вашего приложения на провайдер OAuth2 "авторизуйте" URL
  • обмен "кодом", возвращаемым поставщиком OAuth2 для токена доступа

Для # 1 все, что вам нужно проверить, - это то, что при вызове маршрута, который запускает процесс аутентификации, ответ будет перенаправлен поставщику OAuth2. Это легко выполнить с помощью Flask тестового клиента. Ответ должен иметь код состояния 302 и заголовок "Местоположение", установленный на URL авторизации для вашего поставщика OAuth2. Обратите внимание, что вам не нужно, чтобы провайдер был включен, вы просто проверяете, что ответ является перенаправлением, но вам не нужно на самом деле перенаправлять.

Тестирование для № 2 немного более активно. В вашем приложении Flask есть специальный URL-адрес, который обозначается как "URL-адрес перенаправления" для провайдера OAuth2, чтобы отправить вам код авторизации. Вы можете просто вызвать этот URL-адрес с помощью тестового клиента Flask, передающего макет кода, и у него нет проблем.

Проблема заключается в том, что в функции вида, которая обрабатывает ваш URL-адрес переадресации, вам нужно вызвать поставщика OAuth2 для обмена аутентификационным кодом для токена доступа, и это выполняется синхронно. Чтобы предотвратить эту транзакцию, вы должны проверить app.config['TESTING'] и в этом случае пропустить фактический запрос и заменить его фальшивым ответом, который включает токен доступа.

С этого момента вам также необходимо подделать любые дополнительные вызовы в провайдер OAuth2, которые отправляют токен доступа для запроса данных.

Если вы используете клиентскую библиотеку OAuth2 в своем приложении Flask, может быть проще создать поставщик макета, не создавая тестовые исключения в вашем приложении. В моем случае я использую rauth, и для этого я создал подкласс класса OAuth2Service, который переопределяет правильные методы и отвечает макетными данными, которые Я захватил с реальной сессии. Затем в моей тестовой настройке я просто создаю макет службы, и приложение обмануто, думая, что оно разговаривает с реальным сервером.

Надеюсь, это поможет.