From 51a9d84cd18642922c0b29480773f2899297c675 Mon Sep 17 00:00:00 2001 From: Bang <15622356989@163.com> Date: Sun, 24 Jul 2022 17:56:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20iframe=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 1 - src/api/index.js | 9 ++-- src/router.js | 24 +++++++++ src/shared/login.js | 119 +++++++++++++++-------------------------- src/stores/index.js | 2 +- src/views/TheHome.vue | 22 ++------ src/views/TheLogin.vue | 105 ++++++++++++++++++++++++++++++++++++ vite.config.js | 2 +- 8 files changed, 182 insertions(+), 102 deletions(-) create mode 100644 src/views/TheLogin.vue diff --git a/src/App.vue b/src/App.vue index 814bfa6..825608c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -21,7 +21,6 @@ watch( try { querySubdomain( Object.assign(config, { - userId: String(userInfoStore.id), token: userInfoStore.token, }) ).then((data) => { diff --git a/src/api/index.js b/src/api/index.js index 9766264..8fc3b49 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -12,13 +12,12 @@ export function queryAppId() { } /** - * 获取token及用户信息 - * @param {Object} params {id:'', federationIdentityId: ''} + * 获取idtoken * @returns */ -export function queryAuthentication(params) { - const url = `/api/playground/oauth2/authentication`; - return request.post(url, params).then((res) => { +export function queryIdToken(params) { + const url = `/api/playground/user/getIdToken`; + return request.get(url, { params }).then((res) => { return res.data; }); } diff --git a/src/router.js b/src/router.js index 0e9115f..5d86f57 100644 --- a/src/router.js +++ b/src/router.js @@ -1,16 +1,40 @@ import { createRouter, createWebHistory } from 'vue-router'; +import { getUserAuth, requestUserInfo } from '@/shared/login'; +import { useLoginStore } from './stores'; export const routes = [ { path: '/', redirect: '/home', }, + // 登录页 + { + path: '/login', + name: 'login', + component: () => { + return import('@/views/TheLogin.vue'); + }, + }, + // webclient { path: '/home', name: 'home', component: () => { return import('@/views/TheHome.vue'); }, + beforeEnter: async () => { + const loginStore = useLoginStore(); + if (!loginStore.isLogined) { + const { token } = getUserAuth(); + if (token) { + await requestUserInfo(); + } + } + if (!loginStore.isLogined) { + return { name: 'login' }; + } + return true; + }, }, ]; diff --git a/src/shared/login.js b/src/shared/login.js index 4761864..37355dd 100644 --- a/src/shared/login.js +++ b/src/shared/login.js @@ -1,6 +1,11 @@ import { AuthenticationClient } from 'authing-js-sdk'; import { useLoginStore, useUserInfoStore } from '@/stores'; -import { queryAppId, queryUserInfo, queryUserTokenInfo } from '@/api'; +import { + queryAppId, + queryIdToken, + queryUserInfo, + queryUserTokenInfo, +} from '@/api'; // 登录事件 export const LOGIN_EVENTS = { @@ -29,27 +34,25 @@ function setStatus(status) { } // 存储用户id及token,用于下次登录 -export function saveUserAuth(token, info) { - if (!info && !token) { - localStorage.removeItem(LOGIN_KEYS.USER_INFO); +export function saveUserAuth(token) { + if (!token) { localStorage.removeItem(LOGIN_KEYS.USER_TOKEN); resetStore(); } else { - localStorage.setItem(LOGIN_KEYS.USER_INFO, JSON.stringify(info)); localStorage.setItem(LOGIN_KEYS.USER_TOKEN, token); } } -function initStore(token, id, domain) { - if (!id && !token) { +function initStore(token, domain) { + if (!token) { resetStore(); } else { const userInfoStore = useUserInfoStore(); - userInfoStore.id = id; userInfoStore.token = token; userInfoStore.domain = domain; } } + function resetStore() { const userInfoStore = useUserInfoStore(); userInfoStore.$reset(); @@ -58,58 +61,39 @@ function resetStore() { // 获取用户id及token export function getUserAuth() { let token = localStorage.getItem(LOGIN_KEYS.USER_TOKEN); - let _info = localStorage.getItem(LOGIN_KEYS.USER_INFO); - let userInfo; - let id; - try { - userInfo = JSON.parse(_info) || {}; - } catch (error) { - userInfo = {}; - } - if (token === 'undefined' || _info === 'undefined') { + + if (token === 'undefined') { saveUserAuth(); token = ''; - id = 0; - } else { - id = parseInt(userInfo.sub); } return { - userInfo, - id, token, }; } -function afterLogined(userInfo, domain) { - if (!userInfo || !userInfo.userId) { - return; - } - - const { userId, userToken } = userInfo; - - if (!userId || !userToken) { +function afterLogined(token, domain) { + if (!token) { setStatus(LOGIN_STATUS.FAILED); saveUserAuth(); return console.error('用户信息不正确!'); } - initStore(userToken, userId, domain); + initStore(token, domain); setStatus(LOGIN_STATUS.DONE); } // 请求用户信息 export async function requestUserInfo() { - const { id, token } = getUserAuth(); - if (id && token) { + const { token } = getUserAuth(); + if (token) { try { setStatus(LOGIN_STATUS.DOING); const res = await queryUserInfo({ - userId: id, token, }); if (res.code === 200) { - afterLogined(res.userInfo, res.domain); + afterLogined(token, res.domain); } else { setStatus(LOGIN_STATUS.FAILED); saveUserAuth(); @@ -123,32 +107,26 @@ export async function requestUserInfo() { } } -const redirectUri = `${location.origin}/`; function createClient(appId, appHost) { return new AuthenticationClient({ - appId: '621de88c40c828c2296cd1cc', - appHost: 'https://tryme.authing.cn', - redirectUri, + appId, + appHost, + redirectUri: `${window.location.href}/`, }); } // 开始鉴权 export async function goAuthorize() { - queryAppId().then((res) => { - if (res.code === 200) { - const client = createClient( - res.callbackInfo.appId, - res.callbackInfo.appHost - ); - // 构造 OIDC 授权登录 URL - let url = client.buildAuthorizeUrl(); - // 如果需要获取 Refresh token,请在 scope 中加入 offline_access 项 - let url2 = client.buildAuthorizeUrl({ - scope: 'openid profile offline_access', - }); - location.href = url; - url2; - } - }); + const res = await queryAppId(); + if (res.code === 200) { + const client = createClient( + res.callbackInfo.appId, + res.callbackInfo.appHost + ); + // 构造 OIDC 授权登录 URL + const url = client.buildAuthorizeUrl(); + const userInfoStore = useUserInfoStore(); + userInfoStore.loginUrl = url; + } } // 退出 @@ -159,12 +137,13 @@ export function logout() { res.callbackInfo.appId, res.callbackInfo.appHost ); - const { userInfo } = getUserAuth(); + const { token } = getUserAuth(); + const idToken = queryIdToken({ token }); let logoutUrl = client1.buildLogoutUrl({ protocol: 'oidc', expert: true, - redirectUri, - idToken: userInfo.idtoken, + redirectUri: `${location.origin}/login`, + idToken: idToken, }); setStatus(LOGIN_STATUS.NOT); saveUserAuth(); @@ -173,29 +152,19 @@ export function logout() { }); } -export function getCodeByUrl() { +export async function getCodeByUrl() { const query = getUrlParam(); if (query.code && query.state) { const param = { code: query.code, state: query.state, }; - queryUserTokenInfo(param).then((res) => { - const { - token = '', - idtoken = '', - user: { sub = '' }, - } = res; - saveUserAuth(token, { sub, idtoken }); - // 去掉url中的code - let newUrl = location.origin; - if (window.history.replaceState) { - window.history.replaceState({}, '', newUrl); - } else { - window.location.href = newUrl; - } - requestUserInfo(); - }); + const res = await queryUserTokenInfo(param); + const { token = '' } = res; + saveUserAuth(token); + const newUrl = `${location.origin}/login`; + window.location.href = null; + window.parent.window.location.href = newUrl; } } diff --git a/src/stores/index.js b/src/stores/index.js index 5ef8273..96a985c 100644 --- a/src/stores/index.js +++ b/src/stores/index.js @@ -39,8 +39,8 @@ export const useLoginStore = defineStore('login', { // 用户信息 export const useUserInfoStore = defineStore('user', { - id: '', token: '', domain: '', subdomain: '', + loginUrl: '', }); diff --git a/src/views/TheHome.vue b/src/views/TheHome.vue index c16378a..733d7ab 100644 --- a/src/views/TheHome.vue +++ b/src/views/TheHome.vue @@ -1,13 +1,6 @@ + + + + diff --git a/vite.config.js b/vite.config.js index 58e6dc0..547971a 100644 --- a/vite.config.js +++ b/vite.config.js @@ -24,7 +24,7 @@ export default defineConfig({ port: 1234, proxy: { '/api': { - target: 'https://opengaussplayground.test.osinfra.cn/', + target: 'https://tryme.test.osinfra.cn/', changeOrigin: true, }, }, -- Gitee