簡體   English   中英

在django-rest-framework中插入django-allauth作為端點

[英]Plug in django-allauth as endpoint in django-rest-framework

我在我的網站上使用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相關的代碼

urls.py

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

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

你可以使用Django Rest Auth這取決於django-allauth。 它很容易集成。

雖然我不太確定如何一起使用allauth和rest-fremework,但allauth並沒有提供這樣的終點

建議:自己制作以下變體:
調用allauth.socialaccount.providers.facebook.views.fb_complete_login(無,socialtoken),其中socialtoken是在login_by_token中創建的。 這會執行(更深入的一些功能)django.contrib.auth.login,可能會創建一個acct。

之后,為了在移動設備上使用,可以使用auth(非FB)令牌:獲取用戶數據(來自會話?),並調用rest_framework.authtoken.views.obtain_auth_token

筆記:
1.這無法解決電子郵件沖突或連接社交/本地活動。
2.我沒有嘗試過 - 如果你能使用它,請發布代碼。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM