keycloak-demo-frontend/src/reducers/_Capture/tokenCapture.ts

65 lines
2.1 KiB
TypeScript

import API from '@API/index';
import Env from '@Env/index';
import { postGlobalReduxReset } from '@Reducers/global/actions';
const EXPIRE_TIME_MS = 1000 * 60 * 60 * 24; // 確認一天前有沒有過期
/* General Action : For Local Token Storage */
export const removeLocalUserToken = (env: Env): void => {
const localTokenName = env.TokenLocalStorageName;
const localToken = localStorage.getItem(localTokenName);
if (localToken) {
localStorage.removeItem(localTokenName);
}
};
export const saveLocalUserToken = (env: Env, token: string): void => {
const localTokenName = env.TokenLocalStorageName;
const localToken = localStorage.getItem(localTokenName);
if (localToken) {
removeLocalUserToken(env);
}
localStorage.setItem(localTokenName, JSON.stringify({ token }));
};
export const readLocalUserToken = async (env: Env, api: API): Promise<boolean> => {
const localTokenName = env.TokenLocalStorageName;
const localToken = localStorage.getItem(localTokenName);
if (localToken) {
const localTokenJson = JSON.parse(localToken);
api.updateAccessToken(localTokenJson.token);
const isAccessExpired = await api.checkAccessTokenExpired(EXPIRE_TIME_MS);
if (isAccessExpired) {
removeLocalUserToken(env);
return false;
}
return true;
}
return false;
};
export const checkUserTokenIsValid = async (env: Env, api: API, dispatch: any): Promise<boolean> => {
const isAccessTokenValid = await api.checkAccessTokenValid(); // 確認 Token 是否合法
/* 合法 */
if (isAccessTokenValid) {
const isAccessTokenExpired = await api.checkAccessTokenExpired(EXPIRE_TIME_MS); // 確認 Token 是否過期
/* 沒過期 */
if (!isAccessTokenExpired) {
return true;
}
/* 過期 */
if (isAccessTokenExpired) {
api.removeAccessToken();
dispatch(postGlobalReduxReset());
return false;
}
return true;
}
/* 不合法 */
if (!isAccessTokenValid) {
const localTokenName = env.TokenLocalStorageName;
localStorage.removeItem(localTokenName);
api.removeAccessToken();
dispatch(postGlobalReduxReset());
return false;
}
return false;
};