diff --git a/web/src/components/auth/LoginForm.jsx b/web/src/components/auth/LoginForm.jsx index 489de2276..8beb0f085 100644 --- a/web/src/components/auth/LoginForm.jsx +++ b/web/src/components/auth/LoginForm.jsx @@ -294,7 +294,7 @@ const LoginForm = () => { setGithubButtonDisabled(true); }, 20000); try { - onGitHubOAuthClicked(status.github_client_id); + onGitHubOAuthClicked(status.github_client_id, { shouldLogout: true }); } finally { // 由于重定向,这里不会执行到,但为了完整性添加 setTimeout(() => setGithubLoading(false), 3000); @@ -309,7 +309,7 @@ const LoginForm = () => { } setDiscordLoading(true); try { - onDiscordOAuthClicked(status.discord_client_id); + onDiscordOAuthClicked(status.discord_client_id, { shouldLogout: true }); } finally { // 由于重定向,这里不会执行到,但为了完整性添加 setTimeout(() => setDiscordLoading(false), 3000); @@ -324,7 +324,12 @@ const LoginForm = () => { } setOidcLoading(true); try { - onOIDCClicked(status.oidc_authorization_endpoint, status.oidc_client_id); + onOIDCClicked( + status.oidc_authorization_endpoint, + status.oidc_client_id, + false, + { shouldLogout: true }, + ); } finally { // 由于重定向,这里不会执行到,但为了完整性添加 setTimeout(() => setOidcLoading(false), 3000); @@ -339,7 +344,7 @@ const LoginForm = () => { } setLinuxdoLoading(true); try { - onLinuxDOOAuthClicked(status.linuxdo_client_id); + onLinuxDOOAuthClicked(status.linuxdo_client_id, { shouldLogout: true }); } finally { // 由于重定向,这里不会执行到,但为了完整性添加 setTimeout(() => setLinuxdoLoading(false), 3000); diff --git a/web/src/components/auth/RegisterForm.jsx b/web/src/components/auth/RegisterForm.jsx index 021a7803d..c6b5bc183 100644 --- a/web/src/components/auth/RegisterForm.jsx +++ b/web/src/components/auth/RegisterForm.jsx @@ -261,7 +261,7 @@ const RegisterForm = () => { setGithubButtonDisabled(true); }, 20000); try { - onGitHubOAuthClicked(status.github_client_id); + onGitHubOAuthClicked(status.github_client_id, { shouldLogout: true }); } finally { setTimeout(() => setGithubLoading(false), 3000); } @@ -270,7 +270,7 @@ const RegisterForm = () => { const handleDiscordClick = () => { setDiscordLoading(true); try { - onDiscordOAuthClicked(status.discord_client_id); + onDiscordOAuthClicked(status.discord_client_id, { shouldLogout: true }); } finally { setTimeout(() => setDiscordLoading(false), 3000); } @@ -279,7 +279,12 @@ const RegisterForm = () => { const handleOIDCClick = () => { setOidcLoading(true); try { - onOIDCClicked(status.oidc_authorization_endpoint, status.oidc_client_id); + onOIDCClicked( + status.oidc_authorization_endpoint, + status.oidc_client_id, + false, + { shouldLogout: true }, + ); } finally { setTimeout(() => setOidcLoading(false), 3000); } @@ -288,7 +293,7 @@ const RegisterForm = () => { const handleLinuxDOClick = () => { setLinuxdoLoading(true); try { - onLinuxDOOAuthClicked(status.linuxdo_client_id); + onLinuxDOOAuthClicked(status.linuxdo_client_id, { shouldLogout: true }); } finally { setTimeout(() => setLinuxdoLoading(false), 3000); } diff --git a/web/src/helpers/api.js b/web/src/helpers/api.js index b87e5a2f8..6e09bf43c 100644 --- a/web/src/helpers/api.js +++ b/web/src/helpers/api.js @@ -231,8 +231,22 @@ export async function getOAuthState() { } } -export async function onDiscordOAuthClicked(client_id) { - const state = await getOAuthState(); +async function prepareOAuthState(options = {}) { + const { shouldLogout = false } = options; + if (shouldLogout) { + try { + await API.get('/api/user/logout', { skipErrorHandler: true }); + } catch (err) { + + } + localStorage.removeItem('user'); + updateAPI(); + } + return await getOAuthState(); +} + +export async function onDiscordOAuthClicked(client_id, options = {}) { + const state = await prepareOAuthState(options); if (!state) return; const redirect_uri = `${window.location.origin}/oauth/discord`; const response_type = 'code'; @@ -242,8 +256,13 @@ export async function onDiscordOAuthClicked(client_id) { ); } -export async function onOIDCClicked(auth_url, client_id, openInNewTab = false) { - const state = await getOAuthState(); +export async function onOIDCClicked( + auth_url, + client_id, + openInNewTab = false, + options = {}, +) { + const state = await prepareOAuthState(options); if (!state) return; const url = new URL(auth_url); url.searchParams.set('client_id', client_id); @@ -258,16 +277,19 @@ export async function onOIDCClicked(auth_url, client_id, openInNewTab = false) { } } -export async function onGitHubOAuthClicked(github_client_id) { - const state = await getOAuthState(); +export async function onGitHubOAuthClicked(github_client_id, options = {}) { + const state = await prepareOAuthState(options); if (!state) return; window.open( `https://github.com/login/oauth/authorize?client_id=${github_client_id}&state=${state}&scope=user:email`, ); } -export async function onLinuxDOOAuthClicked(linuxdo_client_id) { - const state = await getOAuthState(); +export async function onLinuxDOOAuthClicked( + linuxdo_client_id, + options = { shouldLogout: false }, +) { + const state = await prepareOAuthState(options); if (!state) return; window.open( `https://connect.linux.do/oauth2/authorize?response_type=code&client_id=${linuxdo_client_id}&state=${state}`,