我正在使用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应用程序中使用python-social-auth通过Facebook进行身份验证.但是当用户尝试登录并且当它被重定向到Facebook应用页面点击"取消"按钮时,会出现以下异常:
ERROR 2014-01-03 15:32:15,308 base :: Internal Server Error: /complete/facebook/
Traceback (most recent call last):
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view
return view_func(*args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/django_app/utils.py", line 45, in wrapper
return func(request, backend, *args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/django_app/views.py", line 21, in complete
redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/actions.py", line 54, in do_complete
*args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/strategies/base.py", line 62, in complete
return self.backend.auth_complete(*args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/facebook.py", line 63, in auth_complete
self.process_error(self.data)
File …
Run Code Online (Sandbox Code Playgroud) python django facebook facebook-authentication python-social-auth
有人在模板中使用Python Social Auth和Django 有一个开放的例子吗?
我看了他们的Github回购,在django exmaple中,没有关于如何在模板中处理它(例如登录,注销等).
我正在构建一个带有API后端(使用DRF构建)和angularjs客户端的django应用程序.我的目标是使用JWT代替会话来完全解耦服务器和客户端.我正在尝试将python-social-auth(PSA)与django-rest-framework-jwt(DRFJWT)集成,所以我的目标是让auth流向此:
用户通过角度客户端登录Email/facebook - >客户帖子表格到PSA的网址 - > PSA登录/创建用户 - > [!] DRFJWT创建令牌然后发送回客户端 - >客户端将令牌存储在本地存储中然后使用令牌每个请求
[!]:这是我正在努力的地方.我的想法是我可以像这样修改PSA中的do_complete方法
from rest_framework_jwt.utils import jwt_payload_handler, jwt_encode_handler
def do_complete(backend, login, user=None, redirect_name='next',
*args, **kwargs):
# pop redirect value before the session is trashed on login()
data = backend.strategy.request_data()
redirect_value = backend.strategy.session_get(redirect_name, '') or \
data.get(redirect_name, '')
is_authenticated = user_is_authenticated(user)
user = is_authenticated and user or None
partial = partial_pipeline_data(backend, user, *args, **kwargs)
if partial:
xargs, xkwargs = partial
user = backend.continue_pipeline(*xargs, **xkwargs) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在django中实现python-social-auth.
我希望用户通过Facebook进行身份验证并保存他们的电子邮件.
我能够对用户进行身份验证,但是电子邮件的扩展权限未显示在facebook身份验证框中,并且不会将电子邮件存储在数据库中.
在settings.py我有以下内容:
SOCIAL_AUTH_FACEBOOK_KEY='xxx'
SOCIAL_AUTH_FACEBOOK_SECRET='xxx'
FACEBOOK_EXTENDED_PERMISSIONS = ['email']
AUTHENTICATION_BACKENDS = (
'social.backends.facebook.FacebookOAuth2',
'social.backends.email.EmailAuth',
'django.contrib.auth.backends.ModelBackend',
)
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/done/'
LOGOUT_REDIRECT_URL = '/'
URL_PATH = ''
SOCIAL_AUTH_STRATEGY = 'social.strategies.django_strategy.DjangoStrategy'
SOCIAL_AUTH_STORAGE = 'social.apps.django_app.default.models.DjangoStorage'
SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.social_details',
'social.pipeline.social_auth.social_uid',
'social.pipeline.social_auth.auth_allowed',
'social.pipeline.social_auth.social_user',
'social.pipeline.user.get_username',
'social.pipeline.social_auth.associate_by_email',
# 'users.pipeline.require_email',
'social.pipeline.mail.mail_validation',
'social.pipeline.user.create_user',
'social.pipeline.social_auth.associate_user',
'social.pipeline.social_auth.load_extra_data',
'social.pipeline.user.user_details'
)
Run Code Online (Sandbox Code Playgroud)
facebook对话框......
我怎么解决这个问题?
我目前正在开发一个服务器和Django(1.7),它应该通过使用python-social-auth来处理社交网络的身份验证.我按照本网站上的教程进行操作,该教程描述了简单Web应用程序的过程.这适用于Google和Twitter登录.
由于服务器应该只是一个REST-FULL后端,我决定在客户端获取Access-Token并将其发送到服务器.服务器将通过它进行身份验证.这个过程应该没有问题,甚至在python-social-auth的文档中给出了一个例子.
但是,如果我确实设置了所有内容,我将收到一条错误消息:"后端未找到404".
这是项目的一个最小部分:
settings.py :(我还包括API_KEY和SECRET)
AUTHENTICATION_BACKENDS = (
#'social.backends.facebook.FacebookOAuth2',
'social.backends.google.GoogleOAuth2',
'social.backends.twitter.TwitterOAuth',
'django.contrib.auth.backends.ModelBackend',
)
Run Code Online (Sandbox Code Playgroud)
views.py(用于身份验证视图)
from django.contrib.auth import login
from social.apps.django_app.utils import psa
@psa('social:complete')
def register_by_access_token(request, backend):
token = request.GET.get('access_token')
user = request.backend.do_auth(request.GET.get('access_token'))
if user:
login(request, user)
return 'OK'
else:
return 'ERROR'
Run Code Online (Sandbox Code Playgroud)
我从文档中复制了海峡,只将backend.do_auth更改为request.backend.do_auth.这似乎是文档中的错误.
urls.py:
...
url(r'^register-by-token/(?P<backend>[^/]+)/$', 'register_by_access_token')
...
Run Code Online (Sandbox Code Playgroud)
也正如文档中所建议的那样.
我只是试图让这个只适用于google-oauth,因为有一个简单的js-lib可以为你提供访问令牌.这也很好,我发送请求
GET http://localhost:8000/register-by-token/google-oauth2/<access-token>/
Run Code Online (Sandbox Code Playgroud)
如上所述,返回是未找到的404后端.我做了一些调试,发现登录函数中引发的错误不是后端的do_auth()函数.因此,实际的身份验证过程有效.我还尝试使用随机生成的字符串作为令牌并得到相应的错误,用户无法进行身份验证.
有趣的是,用户甚至拥有一个属性后端,它可以保存"social.backends.google.GoogleOAuth2".
谢谢你,如果你和我一起留了很长的帖子,我希望有人知道可能出错的地方:).期待您的回答.
我在我的网站上使用python-social-auth API进行身份验证.但我得到一个例外`无法导入名称is_secure_transport.
以下是痕迹.
Django 1.7
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'social.apps.django_app.default',
'login')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/social/apps/django_app/utils.py" in wrapper
49. backend, uri)
File "/usr/local/lib/python2.7/dist-packages/social/apps/django_app/utils.py" in load_backend
29. Backend = get_backend(BACKENDS, name)
File "/usr/local/lib/python2.7/dist-packages/social/backends/utils.py" in get_backend
51. load_backends(backends, force_load=True)
File "/usr/local/lib/python2.7/dist-packages/social/backends/utils.py" in load_backends
33. backend = module_member(auth_backend)
File "/usr/local/lib/python2.7/dist-packages/social/utils.py" in module_member
23. module = import_module(mod)
File "/usr/local/lib/python2.7/dist-packages/social/utils.py" …
Run Code Online (Sandbox Code Playgroud) 默认行为似乎是新用户没有权限而没有组.但是,我不想手动授予每个新用户基本权限,我认为他们不想等我这样做.
我应该如何为新用户分配默认权限?
已经提出了一些类似的问题,但对一般情况没有明确的答案:
我正在使用python-social-auth
所以我没有自己的创建用户表单和视图,我想其他人都设置了默认权限.我假设我需要某种类型的on-user-create挂钩,但不确定最干净的方法是什么.
这与创建可能授予用户的默认可能权限无关,但作为参考,
我下面这个答案是非常明确的和有益的,我已经配置的所有设置,但使用Gmail登录后,当我重定向到本地主机:8000/SOC /完整/谷歌的oauth2 /状态= jAwzw ... .我收到了这个错误
HTTPError at /soc/complete/google-oauth2/
403 Client Error: Forbidden for url: https://www.googleapis.com/plus/v1/people/me?access_token=ya29..wwKoNcTfjGshqc8UYfdziBbgVtYP4bgBZ9ehrfsHJjfs-v6Cy2X3ULsdh_rJwbfApw&alt=json
Request Method: GET
Request URL: http://localhost:8000/soc/complete/google-oauth2/?state=jAwzw3EhdvFdUCv2DFia8fN4n7tUic6u&code=4/nvOb3r-U-ZXrxFCT1dSKcTE2wR8MbxhonRWX60cP4-0&authuser=0&session_state=e8244f9ad9dec2b21c83e2b153a6e9595ccefac4..e292&prompt=consent
Django Version: 1.8.1
Exception Type: HTTPError
Exception Value:
403 Client Error: Forbidden for url: https://www.googleapis.com/plus/v1/people/me?access_token=ya29..wwKoNcTfjGshqc8UYfdziBbgVtYP4bgBZ9ehrfsHJjfs-v6Cy2X3ULsdh_rJwbfApw&alt=json
Exception Location: /usr/local/lib/python2.7/dist-packages/requests/models.py in raise_for_status, line 840
Python Executable: /usr/bin/python
Python Version: 2.7.6
Python Path:
['/home/aditya/django/myapp/socialapp',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/pymodules/python2.7',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Server time: Wed, 13 Apr 2016 11:33:21 +0000
Run Code Online (Sandbox Code Playgroud)
我不确定SOCIAL_AUTH_PIPELINE设置,我刚刚复制了它们,就像是
SOCIAL_AUTH_PIPELINE = …
Run Code Online (Sandbox Code Playgroud) django ×9
python ×6
facebook ×3
access-token ×1
angularjs ×1
jwt ×1
oauth-2.0 ×1
python-2.7 ×1