import { UserManager } from 'oidc-client' import { createLocalStorage } from '../cache' let oidcManager = null export const initServe = () => { if (oidcManager) return oidcManager const { VITE_AUTHORITY, VITE_CLIENT_ID, VITE_CLIENT_SECRET, VITE_REDIRECT_URI } = import.meta.env oidcManager = new UserManager({ /* 认证服务器 */ authority: VITE_AUTHORITY, /* 客户端id */ client_id: VITE_CLIENT_ID, client_secret: VITE_CLIENT_SECRET, /* 回调客户端页面 */ redirect_uri: VITE_REDIRECT_URI, post_logout_redirect_uri: VITE_REDIRECT_URI, response_type: 'code', /* 授权范围 */ scope: 'openid profile', automaticSilentRenew: true, revokeAccessTokenOnSignout: true, metadata: { issuer: `${VITE_AUTHORITY}`, authorization_endpoint: `${VITE_AUTHORITY}/oauth2/authorize`, token_endpoint: `${VITE_AUTHORITY}/oauth2/token`, userinfo_endpoint: `${VITE_AUTHORITY}/userinfo`, end_session_endpoint: `${VITE_AUTHORITY}/toLogout`, revocation_endpoint: `${VITE_AUTHORITY}/oauth2/revoke` } }) return oidcManager } export const getUserInfo = async() => { oidcManager = initServe() return await oidcManager.getUser() } /* 登录 */ export const signinRedirect = async() => { oidcManager = initServe() oidcManager.signinRedirect({}) .then(res => { setPath(window.location.pathname) console.log('signed in', res) }).catch(err => { console.err(err) }) } /* 登录回调 */ export const signinRedirectCallback = async() => { const userInfo = await getUserInfo() if (!userInfo) { oidcManager = initServe() return await oidcManager.signinRedirectCallback() } } /* 退出 */ export const signoutRedirect = () => { oidcManager = initServe() oidcManager.signoutRedirect({}) .then(function(res) { setPath(window.location.pathname) console.log('signed out', res) }).catch(function(err) { console.log(err) }) } /* 退出回调 */ export const signoutRedirectCallback = async() => { const userInfo = await getUserInfo() if (!userInfo) { oidcManager = initServe() return await oidcManager.signoutRedirectCallback() } } const PATH_CODE = 'redirect_path' const DURATION = 24 * 60 * 60 export const isPath = createLocalStorage() /* 获取Path */ export function getPath() { return isPath.get(PATH_CODE) } /* 设置Path */ export function setPath(Path, duration = DURATION) { isPath.set(PATH_CODE, Path, duration) } /* 移出Path */ export function removePath() { isPath.remove(PATH_CODE) }