Tag: python social auth

我如何使用Django的OAuth工具包与Python社会authentication?

我正在使用Django Rest Framework构build一个API。 后来这个API应该被iOS和Android设备使用。 我想让我的用户与Facebook和Google等oauth2提供商签约。 在这种情况下,他们根本不需要在我的平台上创build帐户。 但是用户也应该可以在没有Facebook / Google帐户的情况下注册,因为我使用的是django-oauth-toolkit,所以我有自己的oauth2-provider。 对于外部提供者,我使用python-social-auth,它工作正常并自动创build用户对象。 我希望客户端通过使用持有者令牌进行身份validation,对于与我的提供者签约的用户(django-oauth-toolkit为Django REST Framework提供身份validationscheme和权限类),这些用户可以正常工作。 但是,python-social-auth只实现基于会话的authentication,所以没有直接的方法来代表外部oauth2提供者注册的用户进行authentication的API请求。 如果我使用由django-oauth-toolkit生成的access_token,请执行如下的请求: curl -v -H "Authorization: Bearer <token_generated_by_django-oauth-toolkit>" http://localhost:8000/api/ 但是,以下方法不起作用,因为Django REST Framework没有相应的authenticationscheme,而python-social-auth提供的AUTHENTICATION_BACKENDS仅适用于基于会话的authentication: curl -v -H "Authorization: Bearer <token_stored_by_python-social-auth>" http://localhost:8000/api/ 在使用python-social-auth进行身份validation后,使用Django REST Framework提供的可浏览的API工作得很好,只有没有会话cookie的API调用不起作用。 我想知道什么是最好的办法是这个问题。 我看到的方式基本上有两种select: 答:当用户使用外部oauth2提供程序注册(由python-social-auth处理)时,挂接进程以创buildoauth2_provider.models.AccessToken,并继续使用'oauth2_provider.ext.rest_framework.OAuth2Authentication' ,现在进行身份validation还有向外部提供商注册的用户。 这里build议使用此方法: https : //groups.google.com/d/msg/django-rest-framework/ACKx1kY7kZM/YPWFA2DP9LwJ B:使用python-social-auth进行API请求authentication。 我可以通过编写一个自定义的后端和使用register_by_access_token将我自己的用户变成python-social-auth。 但是,由于API调用不能使用Django会话,这意味着我将不得不为Django Rest Framework编写一个validationscheme,该scheme利用python-social-auth存储的数据。 有关如何做到这一点的指针可以在这里find: 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的方式只是在进行login时validation令牌,然后依赖于Django会话。 这意味着我将不得不find一种方法来防止python-social-auth为每个无状态API请求执行整个oauth2-flow,而是检查存储在数据库中的数据,这对于查询并不是真正优化的,因为它是存储为JSON(我可以使用UserSocialAuth.objects.get(extra_data__contains =)虽然)。 […]