我正在使用Django Rest Framework构建API.之后这个API应该被iOS和Android设备使用.我希望允许我的用户注册Facebook和Google等oauth2提供商.在这种情况下,他们根本不必在我的平台上创建一个帐户.但是,如果没有Facebook/Google帐户,用户也应该能够注册,我正在使用django-oauth-toolkit,所以我有自己的oauth2-provider.
对于外部提供者,我使用python-social-auth,它工作正常并自动创建用户对象.
我希望客户端使用bearer令牌进行身份验证,这对于使用我的提供者注册的用户来说很好(django-oauth-toolkit为Django REST Framework提供了身份验证方案和权限类).
但是,python-social-auth仅实现基于会话的身份验证,因此没有直接的方法来代表由外部oauth2提供程序注册的用户进行身份验证的API请求.
如果我使用由django-oauth-toolkit生成的access_token,那么执行这样的请求是有效的:
curl -v -H "Authorization: Bearer <token_generated_by_django-oauth-toolkit>" http://localhost:8000/api/
Run Code Online (Sandbox Code Playgroud)
但是,由于Django REST Framework没有相应的身份验证方案,并且python-social-auth提供的AUTHENTICATION_BACKENDS仅适用于基于会话的身份验证,因此以下情况不起作用:
curl -v -H "Authorization: Bearer <token_stored_by_python-social-auth>" http://localhost:8000/api/
Run Code Online (Sandbox Code Playgroud)
在使用python-social-auth进行身份验证后,使用Django REST Framework提供的可浏览API工作正常,只有没有会话cookie的API调用才能正常工作.
我想知道这个问题的最佳方法是什么.我看待它的方式,我基本上有两个选择:
答:当用户注册外部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请求验证.通过编写自定义后端并使用register_by_access_token,我可以让自己的用户进入python-social-auth.但是,由于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仅在进行登录时验证令牌,之后依赖于Django会话.这意味着我必须找到一种方法来阻止python-social-auth为每个无状态API请求执行整个oauth2-flow,而不是检查存储在数据库中的数据,这些数据并不是真正针对查询进行优化的,因为它是存储为JSON(我可以使用UserSocialAuth.objects.get(extra_data__contains =)).
我也将不得不采取验证的访问令牌范围的保养和使用它们来检查的权限,一些Django的OAuth的工具包已经这样做(TokenHasScope,required_scopes等).
目前,我倾向于使用选项A,因为django-oauth-toolkit提供了与Django Rest Framework的良好集成,我得到了我需要的所有东西.唯一的缺点是我必须将python-social-auth检索到的access_tokens"注入"到django-oauth-toolkit的AccessToken模型中,这在某种程度上感觉不对,但可能是迄今为止最简单的方法.
有没有人反对这样做或者可能以不同的方式处理同样的问题?我错过了一些明显的东西,让我的生活变得更加艰难吗?如果有人已经将django-oauth-toolkit与python-social-auth和外部oauth2提供程序集成,我将非常感谢一些指示或意见.
python django oauth-2.0 django-rest-framework python-social-auth
我正在使用AngularJS开发一个SPA应用程序,它使用Django后端作为服务器.我从SPA与服务器通信的方式是使用django-rest-framework.所以现在我想用facebook(google和twitter)进行身份验证,我在这个主题上阅读了很多内容,发现OAuth.io正在客户端SPA端进行验证,而python-social-auth正在做同样的事情但在服务器端.
所以目前我只有客户端身份验证,我的应用程序连接到Facebook(使用OAuth.io)并成功登录.此过程返回access_token然后我向我的API发出请求,该请求必须登录此用户或通过给定令牌为该用户创建帐户,此部分不起作用.所以我不确定我错在哪里,也许是因为没有关于使用python-social-auth的完整教程所以也许我错过了什么或者......我不知道..
所以我的一些代码:
在SPA方面:这是与OAuth.io的连接,并且正在工作,因为我正在获取访问令牌.然后我必须向我的其他API发出请求.后端是'facebook','google'或'twitter'
OAuth.initialize('my-auth-code-for-oauthio');
OAuth.popup(backend, function(error, result) {
//handle error with error
//use result.access_token in your API request
var token = 'Token ' + result.access_token;
var loginPromise = $http({
method:'POST',
url: 'api-token/login/' + backend + '/',
headers: {'Authorization': token}});
loginPromise.success(function () {
console.log('Succeess');
});
loginPromise.error(function (result) {
console.log('error');
});
});
Run Code Online (Sandbox Code Playgroud)
在我的settings.py中的服务器上,我已经为已安装的应用程序,模板上下文预处理器,一些auth后端添加了社交插件,这是我的文件:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
...,
'rest_framework',
'rest_framework.authtoken',
'api',
'social.apps.django_app.default',
'social'
)
TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth", …Run Code Online (Sandbox Code Playgroud) 我有一个允许使用django-social-auth进行Facebook身份验证的网站
现在我还需要使用非基于cookie的API进行身份验证.我的想法是将"sessionid ="包含为POST字段(它将使用HTTPS).到目前为止,我设法"愚弄"django来访问这个sessionid,好像它是一个cookie(我基本上做了像中间件中的request.COOKIES ['sessionid'] = request.POST ['sessionid'].
我的问题是如何在认证后立即将sessionid提供给用户.根据我的发现,facebook为用户提供了一个"访问令牌",然后将其发送到/ complete/facebook /,由django-social-auth处理并返回包含"sessionid"的"Set-cookie"标题键.但不是那样,我需要它将sessionid键作为页面内容中的json返回(API客户端无法读取http响应头).