Advertisement
bruno83

Tendernet SSO - testna DK implementacija

Feb 7th, 2025
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.91 KB | None | 0 0
  1. #new SSO-login endpoint  
  2. class SSOLoginView(APIView):
  3.     permission_classes = []
  4.  
  5.     def get(self, request, *args, **kwargs):
  6.         token = request.query_params.get("sso-token")
  7.  
  8.         # check if token is in URL
  9.         if not token:
  10.             return Response({"error": "Token not found in URL"}, status=status.HTTP_400_BAD_REQUEST)
  11.  
  12.         try:
  13.             # decode JWT token
  14.             decoded_token = jwt.decode(token, options={"verify_signature": False})
  15.             # korisnik_id and poslovni_subjekt_id from token
  16.             korisnik_id = decoded_token.get("korisnikId")
  17.             poslovni_subjekt_id = decoded_token.get("poslovniSubjektId")
  18.  
  19.             # check for validity of korisnik_id and poslovni_subjekt_id
  20.             if not korisnik_id or not poslovni_subjekt_id:
  21.                 return Response({"error": "korisnik_id is missing from token"}, status=status.HTTP_400_BAD_REQUEST)
  22.  
  23.             # API call Digitalna Komora to get login data
  24.             external_api_url = f"http://test-intra2019.digitalnakomora.hr/HGKClaniceHostToHostAPI/api/Korisnik/GetPrijavaKorisnikPS/{korisnik_id}/{poslovni_subjekt_id}"
  25.            
  26.             response = requests.get(external_api_url, timeout=5)
  27.  
  28.             if response.status_code != 200:
  29.                 return Response({"error": "Data from Digitalna Komora not recived"}, status=response.status_code)
  30.  
  31.             korisnik_data = response.json().get("PrijavaKorisnikData", {})
  32.  
  33.             # get email - we should get response example before defining this?
  34.             korisnik_email = korisnik_data.get("PrijavaKorisnikDataKorisnik", {}).get("email")
  35.  
  36.             if not korisnik_email:
  37.                 return Response({"error": "No email i Digitalna Komora api", "responseData": response.json()}, status=status.HTTP_400_BAD_REQUEST)
  38.  
  39.             # check for user in database by email
  40.             user = User.objects.filter(email=korisnik_email).first()
  41.  
  42.             if not user:
  43.                 return Response({"error": "User not found in Tendernet"}, status=status.HTTP_403_FORBIDDEN)
  44.            
  45.             # get device_id if it exists, otherwise generate a new one
  46.             device_token_entry = DeviceToken.objects.filter(token__user=user).first()
  47.             if device_token_entry:
  48.                 device_id = device_token_entry.device_id
  49.             else:
  50.                 device_id = str(uuid.uuid4())  # Generate new device_id if none exists
  51.  
  52.             # Handle device limit per license
  53.             company_users = user.company.users.all()
  54.             difference = (
  55.                 DeviceToken.objects.filter(token__user__in=company_users)
  56.                 .exclude(device_id=device_id)
  57.                 .count()
  58.                 - user.company.license.device_num
  59.             )
  60.             if difference >= 0:
  61.                 device_tokens = (
  62.                     DeviceToken.objects.filter(token__user__in=company_users)
  63.                     .exclude(device_id=device_id)
  64.                     .order_by("-token__created")
  65.                     .values_list("device_id", flat=True)
  66.                     .distinct()
  67.                 )
  68.                 tokens = DeviceToken.objects.filter(
  69.                     device_id__in=device_tokens[: user.company.license.device_num]
  70.                 ).values_list("token", flat=True)
  71.  
  72.                 AuthToken.objects.filter(user__in=company_users).exclude(digest__in=tokens).delete()
  73.  
  74.             # Generate Knox token and store device_id
  75.             instance, token = AuthToken.objects.create(user)
  76.             DeviceToken.objects.update_or_create(
  77.                 device_id=device_id, defaults={"token": instance}
  78.             )
  79.  
  80.             return Response({"token": token, "user": {"id": user.id, "email": user.email, "device_id": device_id}}, status=status.HTTP_200_OK)
  81.  
  82.         except Exception as e:
  83.             return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement