draupnir4all-web

git clone git://archive.git.mtrnord.blog/MTRNord/draupnir4all-web.git
Log | Files | Refs | README | LICENSE

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 }