将django-allauth作为django-rest-framework的端点插入

48
我在我的网站上使用django-allauth进行社交登录。我还有一个由django-rest-framework支持的REST API,作为移动应用程序的后端。是否有一种方式可以直接将allauth的身份验证后端插入到REST api中,以便我可以验证(和注册)在移动应用程序中使用Facebook登录的用户?
澄清一下:Facebook登录部分由本地SDK处理。 我需要一个类似于“ POST /user”的端点(即创建新用户),但它以Facebook oauth token作为输入,而不是电子邮件/密码等。

可能是重复的问题:oauth2令牌认证使用django-oauth-toolkit和python-social-auth - Kevin Brown-Silva
4个回答

18

你可以使用依赖于django-allauth的Django Rest Auth来实现这个目标。它非常容易集成。


这是最终答案!谢谢。 - Lis
2
代码库已经两年没有维护/被放弃了。 - Gajendra D Ambi
8
目前使用的是 https://github.com/iMerica/dj-rest-auth。 - wsvincent

12

您可以使用这个库进行社交认证 django-rest-framework-social-oauth2。尝试使用与django-allauth相关的代码

urls.py

urlpatterns = [
    url(
        r'^rest/facebook-login/$',
        csrf_exempt(RestFacebookLogin.as_view()),
        name='rest-facebook-login'
    ),
]

序列化器.py

class EverybodyCanAuthentication(SessionAuthentication):
    def authenticate(self, request):
        return None

视图.py

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',
            })

1
你能给我提供一个指南,告诉我如何让它以同样的方式适用于谷歌提供商吗?谢谢。 - Maykel Llanes Garcia

2
虽然我不太确定如何将allauth和rest-framework结合使用,但allauth没有提供这样的端点

建议:创建自己的端点并执行以下变化:
调用allauth.socialaccount.providers.facebook.views.fb_complete_login(None,socialtoken),其中socialtoken是在login_by_token中创建的。这会执行(更深层次的)django.contrib.auth.login,可能创建帐户。

之后,为了在移动设备上使用,可以获取认证(非FB)令牌:从会话中获取用户数据,并调用rest_framework.authtoken.views.obtain_auth_token。

注意:
1. 这没有解决电子邮件冲突或连接社交/本地帐户的方法。
2. 我没有尝试过它-如果您可以让它正常工作,请发布代码。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接