mirror of
https://github.com/dbgate/dbgate
synced 2024-11-07 20:26:23 +00:00
109 lines
3.1 KiB
TypeScript
109 lines
3.1 KiB
TypeScript
import { apiCall, enableApi } from './utility/api';
|
|
import { getConfig } from './utility/metadataLoaders';
|
|
|
|
export function isOauthCallback() {
|
|
const params = new URLSearchParams(location.search);
|
|
const sentCode = params.get('code');
|
|
const sentState = params.get('state');
|
|
|
|
return (
|
|
sentCode && sentState && sentState.startsWith('dbg-oauth:') && sentState == sessionStorage.getItem('oauthState')
|
|
);
|
|
}
|
|
|
|
export function handleOauthCallback() {
|
|
const params = new URLSearchParams(location.search);
|
|
const sentCode = params.get('code');
|
|
|
|
if (isOauthCallback()) {
|
|
sessionStorage.removeItem('oauthState');
|
|
apiCall('auth/oauth-token', {
|
|
code: sentCode,
|
|
redirectUri: location.origin + location.pathname,
|
|
}).then(authResp => {
|
|
const { accessToken, error, errorMessage } = authResp;
|
|
|
|
if (accessToken) {
|
|
console.log('Settings access token from OAUTH');
|
|
localStorage.setItem('accessToken', accessToken);
|
|
internalRedirectTo('/');
|
|
} else {
|
|
console.log('Error when processing OAUTH callback', error || errorMessage);
|
|
internalRedirectTo(`/?page=not-logged&error=${error || errorMessage}`);
|
|
}
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
export async function handleAuthOnStartup(config) {
|
|
if (config.oauth) {
|
|
console.log('OAUTH callback URL:', location.origin + location.pathname);
|
|
}
|
|
if (config.oauth || config.isLoginForm) {
|
|
if (localStorage.getItem('accessToken')) {
|
|
return;
|
|
}
|
|
|
|
redirectToLogin(config);
|
|
}
|
|
}
|
|
|
|
export async function redirectToLogin(config = null, force = false) {
|
|
if (!config) {
|
|
enableApi();
|
|
config = await getConfig();
|
|
}
|
|
|
|
if (config.isLoginForm) {
|
|
if (!force) {
|
|
const params = new URLSearchParams(location.search);
|
|
if (params.get('page') == 'login' || params.get('page') == 'not-logged') {
|
|
return;
|
|
}
|
|
}
|
|
internalRedirectTo('/?page=login');
|
|
return;
|
|
}
|
|
|
|
if (config.oauth) {
|
|
const state = `dbg-oauth:${Math.random().toString().substr(2)}`;
|
|
const scopeParam = config.oauthScope ? `&scope=${config.oauthScope}` : '';
|
|
sessionStorage.setItem('oauthState', state);
|
|
console.log('Redirecting to OAUTH provider');
|
|
location.replace(
|
|
`${config.oauth}?client_id=${config.oauthClient}&response_type=code&redirect_uri=${encodeURIComponent(
|
|
location.origin + location.pathname
|
|
)}&state=${encodeURIComponent(state)}${scopeParam}`
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
|
|
export function internalRedirectTo(path) {
|
|
const index = location.pathname.lastIndexOf('/');
|
|
const newPath = index >= 0 ? location.pathname.substring(0, index) + path : path;
|
|
location.replace(newPath);
|
|
}
|
|
|
|
export async function doLogout() {
|
|
enableApi();
|
|
const config = await getConfig();
|
|
if (config.oauth) {
|
|
localStorage.removeItem('accessToken');
|
|
if (config.oauthLogout) {
|
|
window.location.href = config.oauthLogout;
|
|
} else {
|
|
internalRedirectTo('/?page=not-logged');
|
|
}
|
|
} else if (config.isLoginForm) {
|
|
localStorage.removeItem('accessToken');
|
|
internalRedirectTo('/?page=not-logged');
|
|
} else {
|
|
window.location.href = 'config/logout';
|
|
}
|
|
}
|