我使用angularjs作为前端和djnago rest frame(DRF)作为后端。我想为我的网站进行社交登录。
请帮我解决这个问题..
答案 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)
我希望这可以帮到你