Аутентификация

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

Многие веб-службы требуют аутентификации, и существует много разных типов. Ниже мы описываем различные формы аутентификации, доступные в Requests, от простых до сложных.

Базовая аутентификация

Многие веб-службы, требующие аутентификации, принимают базовую HTTP аутентификацию. Это самый простой вариант, и Requests поддерживает его прямо из коробки.

Сделать requests с HTTP Basic Auth очень просто:

>>> from requests.auth import HTTPBasicAuth
>>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
<Response [200]>

Фактически, HTTP Basic Auth настолько распространен, что Requests предоставляет удобное сокращение для его использования:

>>> requests.get('https://api.github.com/user', auth=('user', 'pass'))
<Response [200]>

Предоставление учетных данных в таком кортеже точно такое же, как в приведенном выше примере HTTPBasicAuth.

netrc аутентификация

Если с аргументом auth не указан метод аутентификации, Requests попытается получить учётные данные аутентификации для имени хоста URL из файла netrc пользователя. Файл netrc переопределяет необработанные заголовки аутентификации HTTP, установленные с помощью headers =.

Если учетные данные для имени хоста найдены, запрос отправляется с помощью базовой HTTP аутентификации.

Дайджест-аутентификация

Другой очень популярной формой HTTP-аутентификации является дайджест- аутентификация, и Requests также поддерживает её прямо из коробки:

>>> from requests.auth import HTTPDigestAuth
>>> url = 'https://httpbin.org/digest-auth/auth/user/pass'
>>> requests.get(url, auth=HTTPDigestAuth('user', 'pass'))
<Response [200]>

OAuth 1 Аутентификация

Распространенной формой аутентификации для нескольких веб-API является OAuth. Библиотека requests-oauthlib позволяет пользователям Requests легко выполнять аутентификацию OAuth 1 для requests:

>>> import requests
>>> from requests_oauthlib import OAuth1

>>> url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
>>> auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET',
...               'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')

>>> requests.get(url, auth=auth)
<Response [200]>

Дополнительные сведения о том, как работает поток OAuth, см. на официальном веб-сайте OAuth. Примеры и документацию по requests-oauthlib можно найти в репозитории requests_oauthlib.

OAuth 2 и аутентификация OpenID Connect

Библиотека requests-oauthlib также обрабатывает OAuth 2, механизм аутентификации, лежащий в основе OpenID Connect. См. requests-oauthlib OAuth2 документацию для получения подробной информации о различных потоках управления учетными данными OAuth 2:

  • Поток веб-приложений

  • Поток мобильных приложений

  • Поток устаревших приложений

  • Поток серверных приложений

Другая проверка подлинности

Requests позволяет легко и быстро подключать другие формы аутентификации. Члены сообщества разработчиков ПО с открытым исходным кодом часто пишут обработчики аутентификации для более сложных или менее часто используемых форм аутентификации. Некоторые из них: числе:

  • Kerberos

  • NTLM

Если вы хотите использовать любую из этих форм аутентификации, перейдите прямо на их страницу GitHub и следуйте инструкциям.

Новые формы аутентификации

Если вы не можете найти хорошую реализацию нужной формы аутентификации, вы можете реализовать её самостоятельно. Requests позволяет легко добавлять собственные формы аутентификации.

Для этого создать подкласс AuthBase и реализуйте метод __call__():

>>> import requests
>>> class MyAuth(requests.auth.AuthBase):
...     def __call__(self, r):
...         # Implement my authentication
...         return r
...
>>> url = 'https://httpbin.org/get'
>>> requests.get(url, auth=MyAuth())
<Response [200]>

Когда к запросу прикреплен обработчик аутентификации, он вызывается во время настройки запроса. Следовательно, метод __call__ должен делать все, что требуется для аутентификации. Некоторые формы аутентификации будут дополнительно добавлять перехватчики для обеспечения дополнительных функций.