Dashboard  2
Lot's of data
Loading...
Searching...
No Matches
oauth.ts
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2024
3** area-rattrapage
4** File description:
5** oauth.ts
6*/
7
8import uuid4 from "uuid4";
9import axios from "axios";
10import DB from './db';
11import { Login } from "./login";
12
13export namespace OAuth {
14 export function generate_oauth_authorisation_url(provider: any, redirect_uri: string, global_values: Object[]): string {
15 console.log("generate_oauth_authorisation_url");
16 // console.log(`data ${provider}`);
17 const base_url = provider["authorisation_base_url"];
18 const client_id = provider["client_id"];
19 const scope = provider["provider_scope"];
20 // console.log(`${base_url} ${client_id} ${scope}`);
21 let state = uuid4();
22 const now = new Date();
23 const expiration = new Date(now.getTime() + (60 * 60 * 1000))
24 global_values.push({
25 state: state,
26 expiration: expiration
27 });
28 state += `:${provider["provider_name"]}`;
29 let completed_url = "";
30 if (provider["provider_name"] === "google") {
31 completed_url = `access_type=offline&client_id=${client_id}&redirect_uri=${redirect_uri}&prompt=consent`;
32 } else {
33 completed_url = `client_id=${client_id}&redirect_uri=${redirect_uri}`;
34 }
35 completed_url += `&response_type=code&scope=${scope}&state=${state}`;
36 var final_url = "";
37 for (var i = 0; i < completed_url.length; i++) {
38 if (completed_url[i] === " ") {
39 final_url += "%20";
40 } else if (completed_url[i] === ":") {
41 final_url += "%3A";
42 } else if (completed_url[i] === "/") {
43 final_url += "%2F";
44 } else if (completed_url[i] === "?") {
45 final_url += "%3F";
46 // } else if (completed_url[i] === "&") {
47 // final_url += "%26";
48 } else {
49 final_url += completed_url[i];
50 }
51 }
52 final_url = base_url + "?" + final_url;
53 // console.log(`Completed url = ${completed_url}`);
54 // console.log(`final_url = ${final_url}`);
55 return final_url;
56 };
57
58 // For the callback
59 export async function exchange_code_for_token(code: string, provider_data: any, redirect_uri: string) {
60 console.log("exchange_code_for_token");
61 try {
62 const response = await axios.post(
63 provider_data["token_grabber_base_url"],
64 {
65 "client_id": provider_data["client_id"],
66 "client_secret": provider_data["client_secret"],
67 "code": code,
68 "redirect_uri": redirect_uri,
69 "grant_type": "authorization_code"
70 },
71 {
72 headers: {
73 "Accept": "application/json",
74 "Content-Type": "application/x-www-form-urlencoded"
75 }
76 }
77 )
78 // console.log(response);
79 // console.log(`Response data: ${JSON.stringify(response.data)}`);
80 return response.data;
81 } catch (error) {
82 console.log(error);
83 throw error;
84 }
85 };
86
87 export async function get_user_information(provider_data: any, access_token: string, database: DB) {
88 console.log("get_user_information");
89 const user_info_getter_url = provider_data["user_info_base_url"]
90 // console.log(`User info getter url: ${user_info_getter_url}`);
91
92 try {
93 const response = await axios.get(
94 user_info_getter_url,
95 {
96 headers: {
97 "Authorization": `Bearer ${access_token}`
98 }
99 }
100 )
101 // console.log(`User info getter response without stringify: ${response}`);
102 // console.log(`User info getter response with stringify: ${JSON.stringify(response.data)}`);
103 return response.data;
104 } catch (error) {
105 console.log(error);
106 throw error;
107 }
108 };
109
110 export async function insert_user_in_db(user_email: string, provider_data: any, user_oauth_info: any[], database: DB) {
111 await database.writeToTable("users", ["email"], [user_email]);
112 const user_id = await database.getContentFromTable("users", ["id"], `email = '${user_email}'`);
113 if (!user_id || user_id.length === 0) {
114 console.log("Failed to retrieve user id from created user.");
115 return null;
116 }
117 user_oauth_info.push(user_id[0]["id"]);
118 user_oauth_info.push(provider_data["id"]);
119 // console.log(`User information to insert in Oauth connections table: ${user_oauth_info}`);
120 await database.writeToTable("sso_connections", ["token", "expiration", "lifespan", "refresh_link", "user_id", "service_id"], user_oauth_info);
121 const token = await Login.log_user_in(user_email, database);
122 console.log(`Token: ${token}`);
123 return token;
124 };
125
126 export async function log_oauth_user(user_email: string, provider_data: any, user_oauth_info: any[], database: DB) {
127 const user_from_db = await database.getContentFromTable('users', ['*'], `email = '${user_email}'`);
128 if (!user_from_db || user_from_db.length === 0) {
129 console.log(`User not found, entering into insert user in db.`);
130 return insert_user_in_db(user_email, provider_data, user_oauth_info, database);
131 }
132 console.log(`User found from db, entering into doing oauth connection normally.`);
133 // console.log(`User from db: ${user_from_db}`);
134 const user_from_oauth_connection = await database.getContentFromTable("sso_connections", ["*"], `user_id = '${user_from_db["id"]}' AND service_id = '${provider_data["id"]}'`);
135 if (!user_from_oauth_connection || user_from_oauth_connection.length === 0) {
136 user_oauth_info.push(user_from_db[0]["id"]);
137 user_oauth_info.push(provider_data["id"]);
138 // console.log(`User information to insert in Oauth connections table: ${user_oauth_info}`);
139 await database.writeToTable("sso_connections", ["token", "expiration", "lifespan", "refresh_link", "user_id", "service_id"], user_oauth_info);
140 }
141 const token = await Login.log_user_in(user_email, database);
142 // console.log(`Token = ${token}`);
143 return token;
144 };
145
146 export async function handle_provider_response(provider_response: any, provider_data: any, database: DB) {
147 let user_oauth_info: any[] = [];
148 let user_getter_response: any;
149
150 user_oauth_info.push(provider_response["access_token"]);
151 if (provider_data["provider_name"] === "github") {
152 const now = new Date().toISOString().slice(0, 19).replace("T", " ");
153 user_oauth_info.push(now);
154 user_oauth_info.push(0);
155 user_oauth_info.push("NULL");
156 }
157 // console.log("Actual user oauth info", user_oauth_info);
158 try {
159 user_getter_response = await get_user_information(provider_data, provider_response["access_token"], database);
160 } catch (error) {
161 throw error;
162 }
163
164 let user_email = "";
165 if (provider_data["provider_name"] === "github") {
166 const foundItem = user_getter_response.find((item: any) => item.primary === true);
167 user_email = foundItem["email"];
168 } else {
169 user_email = user_getter_response["email"];
170 }
171 // console.log(`Got email: ${user_email}`);
172 const token = await log_oauth_user(user_email, provider_data, user_oauth_info, database);
173 return token;
174 };
175};