From 92e0eef36d8a13718f7ad91a623bbedbfd7b9116 Mon Sep 17 00:00:00 2001
From: "Cross, Liam (UG - Comp Sci & Elec Eng)" <lc01383@surrey.ac.uk>
Date: Tue, 2 Apr 2024 15:35:34 +0000
Subject: [PATCH] Authorize now calls backend

---
 GatewayAPI/Program.cs                          |  3 ++-
 UserMicroservice/Controllers/UserController.cs |  6 +++++-
 client/src/providers/AuthProvider.tsx          | 14 +++++++++++++-
 client/src/services/Authorise/Authorise.ts     |  7 +++++++
 client/src/services/Login/Login.ts             |  2 +-
 client/src/services/Register/Register.ts       |  2 +-
 6 files changed, 29 insertions(+), 5 deletions(-)
 create mode 100644 client/src/services/Authorise/Authorise.ts

diff --git a/GatewayAPI/Program.cs b/GatewayAPI/Program.cs
index c8b364e..0ed1620 100644
--- a/GatewayAPI/Program.cs
+++ b/GatewayAPI/Program.cs
@@ -16,7 +16,8 @@ builder.Services.AddCors(options =>
     {
         builder.WithOrigins("http://localhost:4200")
                .AllowAnyMethod()
-               .AllowAnyHeader();
+               .AllowAnyHeader()
+               .AllowCredentials();
     });
 });
 
diff --git a/UserMicroservice/Controllers/UserController.cs b/UserMicroservice/Controllers/UserController.cs
index b14e108..68e4dd2 100644
--- a/UserMicroservice/Controllers/UserController.cs
+++ b/UserMicroservice/Controllers/UserController.cs
@@ -59,8 +59,12 @@ namespace UserMicroservice.Controllers
             if (!int.TryParse(userIdString, out int userId))
                 return BadRequest("User ID is invalid.");
 
+            User? user = _userService.GetUser(userId);
+            if(user == null)
+              return Unauthorized();
+
             setAuthCookies(userId);
-            return Ok();
+            return Ok(new { user.Id, user.Username, user.Email, user.Type });
         }
 
         // POST: api/User/login
diff --git a/client/src/providers/AuthProvider.tsx b/client/src/providers/AuthProvider.tsx
index 668859c..9322a12 100644
--- a/client/src/providers/AuthProvider.tsx
+++ b/client/src/providers/AuthProvider.tsx
@@ -1,6 +1,7 @@
 import { ReactNode, useEffect, useState } from 'react';
 import { AuthContext } from '../contexts/AuthContext';
 import Spinner from '../components/Spinner/Spinner';
+import { authoriseUser } from '../services/Authorise/Authorise';
 
 export interface IUser {
   id: number;
@@ -15,7 +16,18 @@ function AuthProvider({ children }: { children: ReactNode }) {
   const [user, setUser] = useState<IUser>();
 
   useEffect(() => {
-    setTimeout(() => setLoading(false), 500); // Fake api timer
+    async function authUser() {
+      try {
+        const result = await authoriseUser();
+        giveAuth();
+        updateUser(result.data);
+        setLoading(false);
+      } catch (error) {
+        setLoading(false);
+      }
+    }
+
+    authUser();
   }, []);
 
   const giveAuth = () => {
diff --git a/client/src/services/Authorise/Authorise.ts b/client/src/services/Authorise/Authorise.ts
new file mode 100644
index 0000000..d01fa96
--- /dev/null
+++ b/client/src/services/Authorise/Authorise.ts
@@ -0,0 +1,7 @@
+import { AxiosResponse } from 'axios';
+import Api from '../../helpers/Api';
+import { IUser } from '../../providers/AuthProvider';
+
+export async function authoriseUser(): Promise<AxiosResponse<IUser>> {
+  return Api.post('User/authorize', {}, { withCredentials: true });
+}
diff --git a/client/src/services/Login/Login.ts b/client/src/services/Login/Login.ts
index f29ae64..573fa72 100644
--- a/client/src/services/Login/Login.ts
+++ b/client/src/services/Login/Login.ts
@@ -7,5 +7,5 @@ export async function loginUser(form: ILoginForm): Promise<AxiosResponse<IUser>>
   return Api.post('User/login', {
     Email: form.email,
     Password: form.password
-  });
+  }, { withCredentials: true });
 }
diff --git a/client/src/services/Register/Register.ts b/client/src/services/Register/Register.ts
index 1b7fd7f..5d4416a 100644
--- a/client/src/services/Register/Register.ts
+++ b/client/src/services/Register/Register.ts
@@ -10,5 +10,5 @@ export async function registerUser(form: IRegisterForm): Promise<AxiosResponse<I
     Username: form.name,
     Password: form.password,
     UserType: userStringToType(form.customerType)
-  });
+  }, { withCredentials: true });
 }
-- 
GitLab