首页 文章

如何使用DRF作为后端进行社交登录,将angularjs作为前端和DRF返回jwt令牌以进行进一步交互[关闭]

提问于
浏览
0

I am using angularjs as frontend and djnago rest frame(DRF) as backend. I want to make social login for my site.

要求

  • 用户使用该应用程序登录FB / Google .

  • FB / Google返回access_token .

  • 应用程序使用POST请求将此access_token发送到Django后端 .

  • Django后端查找与此FB帐户关联的用户,或使用FB帐户的名字,姓氏和电子邮件创建新帐户 .

  • Django返回JWT令牌以进行进一步的身份验证 .

  • JWT作为cookie保存在浏览器中 .

  • 接下来,应用程序使用此JWT对用户进行身份验证,然后不再需要FB登录 .

pls help me how i make this..

1 回答

  • -1

    我建议您使用Sattelizer是一个angulajs库来使用JWT和社交登录,这里是一个例子with python(该示例使用Flask,但您可以在django中应用相同的逻辑)

    我在django中使用过这个

    from rest_framework_jwt.settings import api_settings
    from rest_framework.views import APIView
    from rest_framework import status
    from rest_framework.response import Response
    from django.contrib.auth.models import User
    from django.shortcuts import get_object_or_404
    from modules.Pacientes.models import Paciente
    from modules.Doctores.models import Doctor
    from urllib.parse import parse_qs, parse_qsl
    from django.conf import settings
    import json
    import requests
    from .utils import *
    import uuid
    
    JWT_PAYLOAD = api_settings.JWT_PAYLOAD_HANDLER
    JWT_ENCODE = api_settings.JWT_ENCODE_HANDLER
    
    
    class AuthGoogle(APIView):
        def post(self, request):
    
            data = dict(client_id=request.data['clientId'],
                        redirect_uri=request.data['redirectUri'],
                        client_secret=settings.GOOGLE_SECRET,
                        code=request.data['code'],
                        grant_type='authorization_code')
            print(data)
            print(settings.ACCESS_TOKEN_URL)
            # Obteniendo Access Token
            r = requests.post(settings.ACCESS_TOKEN_URL, data=data)
            token = json.loads(r.text)
            print(token)
            headers = {'Authorization': 'Bearer {0}'.format(token['access_token'])}
    
            # Obteniendo datos de perfil
    
            r = requests.get(settings.PEOPLE_API_URL, headers=headers)
    
            profile = json.loads(r.text)
    
            print(profile['email'])
    
            try:
                user = User.objects.get(email=profile['email'])
            except User.DoesNotExist:
                user = None
    
            if user:
                payload = JWT_PAYLOAD(user)
                token = JWT_ENCODE(payload)
                return Response({'token': token}, status.HTTP_200_OK)
    
            else:
                user = User.objects.create_user(username=profile['given_name'], email=profile["email"], password="nexo2016")
                paciente = Paciente(user=user, pic_profile=profile['picture'], google_sub=profile['sub'])
                paciente.save()
                send_email_welcome(user)
                payload = JWT_PAYLOAD(user)
                token = JWT_ENCODE(payload)
                return Response({'token': token}, status.HTTP_201_CREATED)
    
    
    class AuthFacebook(APIView):
        def post(self, request):
    
            data = dict(client_id=request.data['clientId'],
                        redirect_uri=request.data['redirectUri'],
                        client_secret=settings.FACEBOOK_SECRET,
                        code=request.data['code'],
                        )
            r = requests.get(settings.ACCESS_TOKEN_URL_FACEBOOK, params=data)
            access_token = json.loads(r.text)
            print(r.text)
            r = requests.get(settings.GRAPH_API_URL, params=access_token)
            print(r.text)
            profile = json.loads(r.text)
    
            try:
                user = User.objects.get(email=profile['email'])
            except User.DoesNotExist:
                user = None
    
            if user:
                payload = JWT_PAYLOAD(user)
                token = JWT_ENCODE(payload)
                return Response({'token': token}, status.HTTP_200_OK)
            else:
                user = User.objects.create_user(username=profile['name'], email=profile['email'],
                                                first_name=profile['first_name'], last_name=profile['last_name'])
                paciente = Paciente(user=user,
                                    pic_profile='https://graph.facebook.com/' + profile['id'] + '/picture?type=normal',
                                    facebook_id=profile['id'])
                paciente.save()
                send_email_welcome(user)
                payload = JWT_PAYLOAD(user)
                token = JWT_ENCODE(payload)
                return Response({'token': token}, status.HTTP_201_CREATED)
    
            return Response(request.data, status.HTTP_500_INTERNAL_SERVER_ERROR)
    

    我希望这可以帮到你

相关问题