mypertamina-microsite-api/microsite_api/user_auth/views.py
2026-02-27 10:21:39 +07:00

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,
}
})