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

时间:2018-01-26 11:20:07

标签: angularjs django django-rest-framework google-login django-socialauth

我使用angularjs作为前端和djnago rest frame(DRF)作为后端。我想为我的网站进行社交登录。

要求

  1. 用户使用该应用程序登录FB / Google。
  2. FB / Google返回access_token。
  3. 应用程序使用POST将此access_token发送到Django后端 请求。
  4. Django Backends找到与此FB帐户关联的用户或 使用FB的名字,姓氏和电子邮件创建一个新的 帐户。
  5. Django返回一个JWT令牌以进行进一步的身份验证。
  6. JWT以cookies形式保存在浏览器中。
  7. 接下来,应用程序使用此JWT对用户进行身份验证,然后不再进行身份验证 FB登录是必要的。
  8. 请帮我解决这个问题..

1 个答案:

答案 0 :(得分:0)

我建议您使用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)

我希望这可以帮到你