我有一个移动应用程序,允许用户通过Facebook注册。一旦我从FB收到访问令牌,我就把它发送到Django后端。
但是然后呢?
django-allauth中有没有一种方法,我可以将访问令牌提供给它,让它创建新的用户/社交帐户?
或者我需要手动完成所有这些操作?
发布于 2013-05-05 07:14:27
我似乎总是在我贴出问题之后就能找到答案。在任何情况下,以下都是UserResource (使用ApiKeyAuthentication的品味api )上的自定义方法。其中大部分代码取自allauth.socialaccount.providers.facebook.views.中的login_by_token方法
我暂时不会选择正确的答案,以防有人发布更好的答案。
def facebook_login(self, request, **kwargs):
self.method_check(request, allowed=['post'])
data = self.deserialize(request, request.raw_post_data, format=request.META.get('CONTENT_TYPE', 'application/json'))
access_token = data.get('access_token', '')
from allauth.socialaccount import providers
from allauth.socialaccount.models import SocialLogin, SocialToken, SocialApp
from allauth.socialaccount.providers.facebook.views import fb_complete_login
from allauth.socialaccount.helpers import complete_social_login
try:
app = SocialApp.objects.get(provider="facebook")
token = SocialToken(app=app,
token=access_token)
login = fb_complete_login(app, token)
login.token = token
login.state = SocialLogin.state_from_request(request)
ret = complete_social_login(request, login)
#if we get here we've succeeded
return self.create_response(request, {
'success': True,
'username': request.user.username,
'user_id': request.user.pk,
'api_key': request.user.api_key.key,
} )
except:
# FIXME: Catch only what is needed
return self.create_response(request, {
'success': False,
'reason': "Bad Access Token",
}, HttpForbidden )
发布于 2017-03-16 21:49:32
现代读者(2017)可能想看看django-rest-auth,它构建在allauth之上,但在构建时考虑到了单页面应用程序:
http://django-rest-auth.readthedocs.io/en/latest/introduction.html
发布于 2013-06-27 03:09:48
工作源代码:在类UserResource(ModelResource)中:
def override_urls(self):
return [
url(r"^(?P<resource_name>%s)/facebook_login%s$" %
(self._meta.resource_name, trailing_slash()),
self.wrap_view('facebook_login'), name="api_facebook_login"),
]
def facebook_login(self, request, **kwargs):
self.method_check(request, allowed=['post'])
data = self.deserialize(
request,
request.raw_post_data,
format=request.META.get('CONTENT_TYPE', 'applicaton/json'))
access_token = data.get('access_token', '')
print(access_token)
from allauth.socialaccount import providers
from allauth.socialaccount.models import SocialLogin, SocialToken, SocialApp
from allauth.socialaccount.providers.facebook.views import fb_complete_login
from allauth.socialaccount.helpers import complete_social_login
try:
app = SocialApp.objects.get(provider="facebook")
print(app)
token = SocialToken(app=app,
token=access_token)
login = fb_complete_login(app, token)
login.token = token
login.state = SocialLogin.state_from_request(request)
ret = complete_social_login(request, login)
#if we get here we've succeeded
return self.create_response(request, {
'success': True,
'username': request.user.username,
'user_id': request.user.pk,
'api_key': request.user.api_key.key,
} )
except:
# FIXME: Catch only what is needed
return self.create_response(request, {
'success': False,
'reason': "Bad Access Token",
}, HttpForbidden )
然后:
curl --dump-header - -H“内容类型:应用程序/json”-X POST --data '{"access_token":"xxxxxxxx"}‘http://xx.xxxxxx.com:8000/api/v1/user/facebook_login/
测试正常,创建用户正常。
谢谢。
https://stackoverflow.com/questions/16381732
复制