118 lines
3.4 KiB
TypeScript
118 lines
3.4 KiB
TypeScript
import type { Emitter, EventType } from 'mitt';
|
|
import type { Router } from 'vue-router';
|
|
|
|
export function authHeader(): Headers {
|
|
// return authorization header with basic auth credentials
|
|
let user = null;
|
|
try {
|
|
user = JSON.parse(localStorage.getItem('user') || '');
|
|
} catch {
|
|
// continue regardless of error
|
|
}
|
|
|
|
const headers = new Headers();
|
|
headers.append('X-Requested-With', 'XMLHttpRequest');
|
|
if (user && user.authdata) {
|
|
headers.append('Authorization', 'Basic ' + user.authdata);
|
|
}
|
|
return new Headers(headers);
|
|
}
|
|
|
|
export function authUrl(): string {
|
|
let user = null;
|
|
try {
|
|
user = JSON.parse(localStorage.getItem('user') || '');
|
|
} catch {
|
|
// continue regardless of error
|
|
}
|
|
|
|
if (user && user.authdata) {
|
|
return encodeURIComponent(atob(user.authdata)).replace('%3A', ':') + '@';
|
|
}
|
|
return '';
|
|
}
|
|
|
|
export function logout() {
|
|
// remove user from local storage to log user out
|
|
localStorage.removeItem('user');
|
|
}
|
|
|
|
export function isLoggedIn(): boolean {
|
|
return localStorage.getItem('user') != null;
|
|
}
|
|
|
|
export function login(username: string, password: string) {
|
|
const requestOptions = {
|
|
method: 'GET',
|
|
headers: {
|
|
'X-Requested-With': 'XMLHttpRequest',
|
|
Authorization: 'Basic ' + btoa(unescape(encodeURIComponent(username + ':' + password))),
|
|
},
|
|
};
|
|
|
|
return fetch('/api/security/authenticate', requestOptions)
|
|
.then(handleAuthResponse)
|
|
.then((retVal) => {
|
|
// login successful if there's a user in the response
|
|
if (retVal) {
|
|
// store user details and basic auth credentials in local storage
|
|
// to keep user logged in between page refreshes
|
|
retVal.authdata = btoa(unescape(encodeURIComponent(username + ':' + password)));
|
|
localStorage.setItem('user', JSON.stringify(retVal));
|
|
}
|
|
|
|
return retVal;
|
|
});
|
|
}
|
|
|
|
export function handleResponse(
|
|
response: Response,
|
|
emitter: Emitter<Record<EventType, unknown>>,
|
|
router: Router,
|
|
ignore_error: boolean = false
|
|
) {
|
|
return response.text().then((text) => {
|
|
const data = text && JSON.parse(text);
|
|
if (!response.ok) {
|
|
if (response.status === 401) {
|
|
// auto logout if 401 response returned from api
|
|
logout();
|
|
emitter.emit('logged-out');
|
|
router.push({
|
|
path: '/login',
|
|
query: { returnUrl: router.currentRoute.value.fullPath },
|
|
});
|
|
return Promise.reject();
|
|
}
|
|
|
|
const error = {
|
|
message: (data && data.message) || response.statusText,
|
|
status: response.status || 0,
|
|
};
|
|
if (!ignore_error) {
|
|
router.push({ name: 'Error', params: error });
|
|
}
|
|
return Promise.reject(error);
|
|
}
|
|
|
|
return data;
|
|
});
|
|
}
|
|
|
|
function handleAuthResponse(response: Response) {
|
|
return response.text().then((text) => {
|
|
const data = text && JSON.parse(text);
|
|
if (!response.ok) {
|
|
if (response.status === 401) {
|
|
// auto logout if 401 response returned from api
|
|
logout();
|
|
}
|
|
|
|
const error = 'Invalid credentials';
|
|
return Promise.reject(error);
|
|
}
|
|
|
|
return data;
|
|
});
|
|
}
|