Можно ли использовать OAuth 2.0 без redirect_uri или без настройки сложного сервера?

Я должен передать некоторые файлы на удаленный сервер, для которого мне нужно выполнить OAuth2.0, чтобы получить токен доступа, а затем просто выполнить запрос POST для загрузки файлов.

Теперь мне лень настраивать проект Django в облаке, а затем выполнять OAuth2, хотя для этого нет "слишком хорошей" библиотеки.

Итак, я собираюсь выполнить OAuth2, используя rauth lib в качестве простого скрипта на Python, не настраивая сервер, который принимает запросы и все...

Однако в профиле удаленного сервера мне нужно предоставить redirect_url и, конечно, в клиентской библиотеке rauth.

Есть ли какие-либо возможные способы сделать это авторизация без реальной настройки проекта в облаке.. Я просто ищу скрипт на python.

1 ответ

Я автор и хранитель истины.

Раут больше не навязывает redirect_uri, так что, если ваш провайдер разрешает это, вы можете отказаться от его использования. Однако, если ваша конечная цель не состоит в настройке сервера, это должно быть выполнимо даже при redirect_uri требуется поставщиком. Вы можете, например, перенаправить на локальный хост, где вы можете настроить минимальный сервер с помощью Flask или, если поставщик разрешит это, какой-нибудь другой, произвольный URL, например, Facebook предоставляет https://www.facebook.com/connect/login_success.html для эта цель. И у провайдера, которого вы используете, может быть похожая схема. Вот пример с Раутом.

Другой вариант - использовать аутентификацию на предъявителя с grant_type=password. Предполагается, что все поставщики OAuth 2.0 поддерживают аутентификацию на предъявителя, но могут не реализовывать пароль grant_type. Это не требует redirect_uriвместо этого вы в конечном итоге передаете серверу свои учетные данные пользователя, и он должен вернуть вам токен доступа. Если ваш провайдер разрешает Bearer Auth с паролем grant_type, это, вероятно, идеально для вас. Rauth 0.5.3 пытается использовать Bearer Auth по умолчанию, поэтому все, что вам нужно сделать, это передать тип grant_type. Не забудьте обновить, прежде чем дать этому попробовать.

Вот простой пример:

# assume you have constructed an OAuth2Service object and bound it to `serv`

params = {'grant_type': 'password',
          'username': 'foo',
          'password': 'hunter2'}

s = service.get_auth_session(params=params)
r = s.get('https://example.com/api/some/endpoint')

В зависимости от провайдера и того, что вы хотите сделать, может потребоваться дополнительное расследование. Однако, надеюсь, это даст вам кое-что для начала.

редактировать

Я думаю, что мой комментарий о пароле grant_type немного сбивает с толку: я, кажется, намекаю, что вы должны использовать его с Bearer Auth (здесь под Bearer Auth я имею в виду прикрепление токена доступа в заголовке Authorization в формате Bearer), но на самом деле вы этого не делаете "т. Допустимо, хотя и не рекомендуется отправлять учетные данные в методе лица [1]. Если вы используете rauth и обнаруживаете, что аутентификация не работает должным образом, вам может потребоваться отключить Bearer Auth следующим образом:

s = service.get_auth_session('/some/resource',
                             data={'code': code},
                             bearer_auth=False)

Из спецификации:

[1] "Клиенты ДОЛЖНЫ делать аутентифицированные запросы с токеном-носителем, используя поле заголовка запроса авторизации со схемой авторизации HTTP-канала-носителя. Серверы ресурсов ДОЛЖНЫ поддерживать этот метод".

Другие вопросы по тегам