2013-09-16 4 views
10

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

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

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

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

+0

обычно «внешний» Oauth (как для обслуживания Twitter, Evernote и т. Д.) Предоставляет sanbox для проведения наших тестов. Разве вы не нашли его для этой цели? –

+0

Но они все равно потребуют от вас аутентификации против них? Просто чтобы они отправили вам фиктивные верительные грамоты для теста? –

+0

да, конечно, они этого требуют.да, они вернули фиктивные учетные данные или эквивалент. Evernote, например, предоставляет специальные ключи только для целей тестирования. И это делает трюк, чтобы закончить наш разработчик API. После того, как вы будете скручивать своего разработчика, чтобы начать производство, вы получите новый ключ api для производства. –

ответ

8

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

  1. редирект из приложения к «авторизовать» URL провайдера oauth2 в
  2. Биржу о «код», возвращенный поставщик oauth2 для маркеров доступа

для # 1 все, что вам нужно проверить, что при вызове маршрута, который начинается процессом аутентификации ответ возвращается перенаправление провайдера oauth2. Это легко осуществить с помощью Flask's test client. Ответ должен иметь код состояния 302 и заголовок «Местоположение», установленный на URL авторизации для вашего поставщика OAuth2. Обратите внимание, что вам не нужно, чтобы провайдер был включен, вы просто проверяете, что ответ является перенаправлением, но вам не нужно перенаправлять.

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

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

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

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

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

+0

Итак, для подклассификации OAuth2Service вам необходимо достаточно отделить создание сеанса, чтобы вы могли диктовать, какую версию OAuth2Service нужно создавать для тесты? – Basil

Смежные вопросы