clientSideAuth.ts (2364B)
1 export async function login(homeserverUrl: string, username: string, password: string): Promise<string> { 2 console.log(`Authenticating with ${homeserverUrl}`); 3 4 const url = new URL("/_matrix/client/v3/login", homeserverUrl); 5 const loginResponse = await fetch(url, { 6 method: 'POST', 7 headers: { 'Content-Type': 'application/json' }, 8 body: JSON.stringify({ 9 type: 'm.login.password', 10 identifier: { 11 type: 'm.id.user', 12 user: username, 13 }, 14 refresh_token: false, 15 initial_device_display_name: "Draupnir4All Web", 16 password, 17 }), 18 }); 19 20 const loginData = await loginResponse.json(); 21 if (!loginData.access_token) { 22 throw new Error(loginData.error || 'Login failed'); 23 } 24 25 return loginData.access_token; 26 } 27 28 interface OpenIDTokenResponse { 29 access_token: string; 30 expires_in: number; 31 matrix_server_name: string; 32 token_type: string; 33 error?: string; 34 } 35 36 export async function generateOpenIDToken(homeserverUrl: string, username: string, accessToken: string): Promise<OpenIDTokenResponse> { 37 if (!accessToken) { 38 throw new Error('Access token is required'); 39 } 40 const url = new URL("/_matrix/client/v3/user/" + encodeURIComponent(username) + "/openid/request_token", homeserverUrl); 41 const response = await fetch(url, { 42 method: 'POST', 43 headers: { 44 'Authorization': `Bearer ${accessToken}`, 45 'Content-Type': 'application/json', 46 }, 47 body: JSON.stringify({ 48 type: 'm.login.openid', 49 }), 50 }); 51 52 const data = await response.json(); 53 if (!data.access_token) { 54 throw new Error(data.error || 'Failed to generate OpenID token'); 55 } 56 57 const dataAsResponse = data as OpenIDTokenResponse; 58 59 return dataAsResponse; 60 } 61 62 export async function logout(homeserverUrl: string, accessToken: string): Promise<void> { 63 console.log(`Logging out with ${homeserverUrl}`); 64 65 const url = new URL("/_matrix/client/v3/logout", homeserverUrl); 66 try { 67 await fetch(url, { 68 method: 'POST', 69 headers: { 70 'Authorization': `Bearer ${accessToken}` 71 }, 72 }); 73 } catch (error: unknown) { 74 console.warn("Failed to logout:", error); 75 } 76 }