Mar*_*0ux 27 python django django-rest-framework django-allauth
我在我的网站上使用django-allauth进行社交登录.我还有一个由django-rest-framework提供支持的REST API,它充当移动应用程序的后端.有没有办法可以直接将allauth的身份验证后端插入REST api,以便我可以验证(并注册)在移动应用程序中使用Facebook登录的用户?
澄清一下:Facebook登录部分由本机SDK处理.我需要一个类似POST /user(即创建一个新用户)的端点,但需要将Facebook oauth令牌作为输入而不是电子邮件/密码等.
您可以使用此libray进行社交认证django-rest-framework-social-oauth2.试试这个与django-allauth相关的代码
urlpatterns = [
url(
r'^rest/facebook-login/$',
csrf_exempt(RestFacebookLogin.as_view()),
name='rest-facebook-login'
),
]
Run Code Online (Sandbox Code Playgroud)
class EverybodyCanAuthentication(SessionAuthentication):
def authenticate(self, request):
return None
Run Code Online (Sandbox Code Playgroud)
class RestFacebookLogin(APIView):
"""
Login or register a user based on an authentication token coming
from Facebook.
Returns user data including session id.
"""
# this is a public api!!!
permission_classes = (AllowAny,)
authentication_classes = (EverybodyCanAuthentication,)
def dispatch(self, *args, **kwargs):
return super(RestFacebookLogin, self).dispatch(*args, **kwargs)
def get(self, request, *args, **kwargs):
try:
original_request = request._request
auth_token = request.GET.get('auth_token', '')
# Find the token matching the passed Auth token
app = SocialApp.objects.get(provider='facebook')
fb_auth_token = SocialToken(app=app, token=auth_token)
# check token against facebook
login = fb_complete_login(original_request, app, fb_auth_token)
login.token = fb_auth_token
login.state = SocialLogin.state_from_request(original_request)
# add or update the user into users table
complete_social_login(original_request, login)
# Create or fetch the session id for this user
token, _ = Token.objects.get_or_create(user=original_request.user)
# if we get here we've succeeded
data = {
'username': original_request.user.username,
'objectId': original_request.user.pk,
'firstName': original_request.user.first_name,
'lastName': original_request.user.last_name,
'sessionToken': token.key,
'email': original_request.user.email,
}
return Response(
status=200,
data=data
)
except:
return Response(status=401, data={
'detail': 'Bad Access Token',
})
Run Code Online (Sandbox Code Playgroud)
您可以为此使用Django Rest Auth,这取决于django-allauth。集成起来非常容易。
虽然我不太确定如何一起使用allauth和rest-fremework,但allauth并没有提供这样的端点。
建议:自己制作,执行以下操作的变体:
调用 allauth.socialaccount.providers.facebook.views.fb_complete_login(None, Socialtoken),其中 Socialtoken 是在 login_by_token 中创建的。它执行(一些更深入的功能)django.contrib.auth.login,可能会创建帐户。
之后,为了在移动设备上使用,可以使用 auth(而不是 FB)令牌:获取用户数据(从会话?),然后调用rest_framework.authtoken.views.obtain_auth_token
注意:
1.这没有办法解决电子邮件冲突或连接社交/本地帐户。
2.我还没有尝试过 - 如果你可以让它工作,请发布代码。
| 归档时间: |
|
| 查看次数: |
10180 次 |
| 最近记录: |