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

问题描述 投票:0回答:5

我在我的网站上使用 django-allauth 进行社交登录。我还有一个由 django-rest-framework 提供支持的 REST API,用作移动应用程序的后端。有没有一种方法可以直接将 allauth 的身份验证后端插入 REST api,以便我可以验证(并注册)在移动应用程序中使用 Facebook 登录的用户?

澄清一下:Facebook 登录部分由本机 SDK 处理。我需要一个像

POST /user
一样工作的端点(即创建一个新用户),但将 Facebook oauth 令牌作为输入而不是电子邮件/密码等。

python django django-rest-framework django-allauth
5个回答
18
投票

您可以使用 Django Rest Auth 来实现此目的,这取决于 django-allauth。非常容易集成。


12
投票

您可以使用此库进行社交身份验证django-rest-framework-social-oauth2。尝试这个 django-allauth 相关代码

url.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

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

2
投票

虽然我不太确定如何一起使用allauth和rest-fremework,但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
投票

你可以使用djoser,但我不知道它如何与allauth配合: https://github.com/sunscrapers/djoser


0
投票

因为这仍然是搜索 Django Allauth 对 DRF 支持时的首要答案,我将补充说 API 支持最近已合并到 Allauth 本身的 main 中,所以现在您不需要任何第三方来实现此目的。 这里是文档,供任何感兴趣的人使用。

© www.soinside.com 2019 - 2024. All rights reserved.