76 lines
2.2 KiB
Python
76 lines
2.2 KiB
Python
# views.py
|
|
import requests
|
|
from rest_framework.views import APIView
|
|
from rest_framework.response import Response
|
|
from rest_framework import status
|
|
from django.contrib.auth import get_user_model
|
|
from rest_framework_simplejwt.tokens import RefreshToken
|
|
|
|
from .serializers import SSOLoginSerializer
|
|
|
|
User = get_user_model()
|
|
|
|
class SSOLoginView(APIView):
|
|
permission_classes = []
|
|
|
|
def post(self, request):
|
|
serializer = SSOLoginSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
username = serializer.validated_data["username"]
|
|
password = serializer.validated_data["password"]
|
|
|
|
# Call SSO
|
|
sso_response = requests.post(
|
|
"http://127.0.0.1:8080/auth/jwt/create/",
|
|
json={
|
|
"username": username,
|
|
"password": password
|
|
},
|
|
timeout=5
|
|
)
|
|
|
|
if sso_response.status_code != 200:
|
|
return Response(
|
|
{"detail": "Invalid credentials"},
|
|
status=status.HTTP_401_UNAUTHORIZED
|
|
)
|
|
|
|
sso_data = sso_response.json()
|
|
sso_token = sso_data.get("access")
|
|
sso_refresh = sso_data.get("refresh")
|
|
|
|
sso_response_user = requests.get(
|
|
"http://127.0.0.1:8080/auth/users/me/",
|
|
headers={"Authorization": f"JWT {sso_token}"},
|
|
timeout=5
|
|
)
|
|
|
|
if (sso_response_user.status_code != 200):
|
|
return Response(
|
|
{"detail": "Failed to fetch user data from SSO"},
|
|
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
)
|
|
|
|
sso_user = sso_response_user.json()
|
|
|
|
# Sync user lokal (optional)
|
|
user, created = User.objects.get_or_create(
|
|
username=username,
|
|
defaults={
|
|
"email": sso_user.get("email", "")
|
|
}
|
|
)
|
|
|
|
# Generate JWT lokal
|
|
refresh = RefreshToken.for_user(user)
|
|
|
|
return Response({
|
|
"refresh": str(refresh),
|
|
"access": str(refresh.access_token),
|
|
"user": {
|
|
"id": user.id,
|
|
"username": user.username,
|
|
"email": user.email,
|
|
}
|
|
}) |