Я создаю API, используя Django Rest Framework. Позже этот API будет потребляться устройствами iOS и Android. Я хочу разрешить моим пользователям регистрироваться с oauth2-провайдерами, такими как Facebook и Google. В этом случае им не нужно создавать учетную запись на моей платформе вообще. Но пользователи также должны иметь возможность регистрироваться, если у вас нет учетной записи Facebook/Google, для которой я использую django-oauth-toolkit, поэтому у меня есть собственный поставщик oauth2.Как использовать Django OAuth Toolkit с Python Social Auth?
Для внешних поставщиков я использую python-social-auth, который отлично работает и автоматически создает пользовательские объекты.
Я хочу, чтобы клиенты выполняли аутентификацию с помощью токенов-носителей, что отлично подходит для пользователей, подписавшихся на мой провайдер (django-oauth-toolkit предоставляет схему аутентификации и классы разрешений для Django REST Framework).
Однако python-social-auth реализует аутентификацию на основе сеанса, поэтому нет простого способа сделать аутентифицированные запросы API от имени пользователей, зарегистрированных внешним поставщиком oauth2.
Если я использую access_token, который был сгенерирован Джанго-OAuth-инструментарием, делая запрос, как это работает:
curl -v -H "Authorization: Bearer <token_generated_by_django-oauth-toolkit>" http://localhost:8000/api/
Однако следующий не работает, так как нет никакой соответствующей схемы аутентификации для Django REST Framework и AUTHENTICATION_BACKENDS предоставляемого питонов-социально-Идент работой только для сеанса аутентификации на основе:
curl -v -H "Authorization: Bearer <token_stored_by_python-social-auth>" http://localhost:8000/api/
Использования листаемого API предоставляемого Django REST Framework после аутентификации с питона-социальной-AUTH работают только е ine, только вызовы API без cookie сеанса не работают.
Мне интересно, какой лучший подход для этой проблемы. Как я это вижу, у меня есть в основном два варианта:
A: Когда пользователь подписывается с внешним поставщиком oauth2 (обработан python-social-auth), подключитесь к процессу для создания oauth2_provider.models.AccessToken и продолжают использовать 'oauth2_provider.ext.rest_framework.OAuth2Authentication'
, теперь аутентифицируя также пользователей, зарегистрированных у внешнего провайдера. Этот подход предлагается здесь: https://groups.google.com/d/msg/django-rest-framework/ACKx1kY7kZM/YPWFA2DP9LwJ
B: Использовать python-social-auth для аутентификации запроса API. Я мог бы завести своих пользователей в python-social-auth, написав собственный бэкэнд и используя register_by_access_token. Однако, поскольку вызовы API не могут использовать сеансы Django, это означало бы, что мне пришлось бы написать схему аутентификации для Django Rest Framework, которая использует данные, хранящиеся в python-social-auth. Некоторые указатели о том, как это сделать, можно найти здесь:
http://psa.matiasaguirre.net/docs/use_cases.html#signup-by-oauth-access-token
http://blog.wizer.fr/2013/11/angularjs-facebook-with-a-django-rest-api/
http://cbdev.blogspot.it/2014/02/facebook-login-with-angularjs-django.html
Однако, как я понимаю, что питон-социально-аутентификации проверяет только маркер при выполнении входа и полагается на сессии Джанго после этого. Это означало бы, что мне пришлось бы найти способ предотвратить python-social-auth от выполнения всего oauth2-потока для каждого запроса API без состояния и скорее проверить данные, хранящиеся в БД, которые на самом деле не оптимизированы для запросов, поскольку это сохраненный как JSON (я мог бы использовать UserSocialAuth.objects.get (extra_data__contains =), хотя).
Я также должен позаботиться о проверке областей доступа к токену и использовать их для проверки разрешений, что-то вроде django-oauth-toolkit (TokenHasScope
, required_scopes
и т. Д.).
В настоящее время я склоняюсь к варианту A, поскольку django-oauth-toolkit обеспечивает хорошую интеграцию с Django Rest Framework, и я получаю все, что мне нужно из коробки. Единственным недостатком является то, что я должен «вводить» access_tokens, полученный python-social-auth, в модель Django-oauth-инструментария AccessToken, которая как-то кажется неправильной, но, вероятно, будет самым простым способом.
Есть ли у кого-нибудь какие-либо возражения против этого или, возможно, решить эту проблему по-другому? Упускаю ли я что-то очевидное и делаю свою жизнь труднее, чем необходимо? Если кто-то уже интегрировал django-oauth-toolkit с python-social-auth и внешними поставщиками oauth2, я был бы очень благодарен за некоторые указания или мнения.
Привет, Кевин, большое спасибо за ваш ответ. Я, вероятно, не дал достаточно ясного представления, но я хочу, чтобы мои пользователи могли регистрироваться с помощью таких поставщиков, как Facebook или Google, как это делает stackoverflow. Я не хочу получать какую-либо информацию от этих поставщиков, только разрешать пользователям входить в систему с ними. Если они регистрируются, например, Google, им не нужно вообще регистрироваться у моего провайдера. Ваше предложение использовать django-oauth-toolkit как прокси-сервер имеет большой смысл, мне нужно продумать его и вернемся к вам позже. – jeverling
Существует только один API, и django-oauth-toolkit должен быть только одним из множества вариантов для регистрации, да. Я думал только о предоставлении внешних поставщиков для регистрации, но хотел бы, чтобы пользователи, у которых нет учетной записи с Google или Facebook, также не хотят связывать ее с моей платформой, чтобы зарегистрироваться. – jeverling
Это должно работать, но в этом случае у меня все еще есть проблема, как выполнять вызовы API, например. приложение iOS, не используя что-то вроде cookie-jar. С django-oauth-toolkit я могу просто использовать заголовок авторизации с токеном-носителем, который теперь не представляется возможным с помощью 'python-social-auth'. – jeverling