Merge pull request #2396 from seefs001/fix/login

fix: Try to fix login error "already logged in" issue
This commit is contained in:
Calcium-Ion
2025-12-09 14:04:48 +08:00
committed by GitHub
3 changed files with 48 additions and 16 deletions

View File

@@ -294,7 +294,7 @@ const LoginForm = () => {
setGithubButtonDisabled(true); setGithubButtonDisabled(true);
}, 20000); }, 20000);
try { try {
onGitHubOAuthClicked(status.github_client_id); onGitHubOAuthClicked(status.github_client_id, { shouldLogout: true });
} finally { } finally {
// 由于重定向,这里不会执行到,但为了完整性添加 // 由于重定向,这里不会执行到,但为了完整性添加
setTimeout(() => setGithubLoading(false), 3000); setTimeout(() => setGithubLoading(false), 3000);
@@ -309,7 +309,7 @@ const LoginForm = () => {
} }
setDiscordLoading(true); setDiscordLoading(true);
try { try {
onDiscordOAuthClicked(status.discord_client_id); onDiscordOAuthClicked(status.discord_client_id, { shouldLogout: true });
} finally { } finally {
// 由于重定向,这里不会执行到,但为了完整性添加 // 由于重定向,这里不会执行到,但为了完整性添加
setTimeout(() => setDiscordLoading(false), 3000); setTimeout(() => setDiscordLoading(false), 3000);
@@ -324,7 +324,12 @@ const LoginForm = () => {
} }
setOidcLoading(true); setOidcLoading(true);
try { try {
onOIDCClicked(status.oidc_authorization_endpoint, status.oidc_client_id); onOIDCClicked(
status.oidc_authorization_endpoint,
status.oidc_client_id,
false,
{ shouldLogout: true },
);
} finally { } finally {
// 由于重定向,这里不会执行到,但为了完整性添加 // 由于重定向,这里不会执行到,但为了完整性添加
setTimeout(() => setOidcLoading(false), 3000); setTimeout(() => setOidcLoading(false), 3000);
@@ -339,7 +344,7 @@ const LoginForm = () => {
} }
setLinuxdoLoading(true); setLinuxdoLoading(true);
try { try {
onLinuxDOOAuthClicked(status.linuxdo_client_id); onLinuxDOOAuthClicked(status.linuxdo_client_id, { shouldLogout: true });
} finally { } finally {
// 由于重定向,这里不会执行到,但为了完整性添加 // 由于重定向,这里不会执行到,但为了完整性添加
setTimeout(() => setLinuxdoLoading(false), 3000); setTimeout(() => setLinuxdoLoading(false), 3000);

View File

@@ -261,7 +261,7 @@ const RegisterForm = () => {
setGithubButtonDisabled(true); setGithubButtonDisabled(true);
}, 20000); }, 20000);
try { try {
onGitHubOAuthClicked(status.github_client_id); onGitHubOAuthClicked(status.github_client_id, { shouldLogout: true });
} finally { } finally {
setTimeout(() => setGithubLoading(false), 3000); setTimeout(() => setGithubLoading(false), 3000);
} }
@@ -270,7 +270,7 @@ const RegisterForm = () => {
const handleDiscordClick = () => { const handleDiscordClick = () => {
setDiscordLoading(true); setDiscordLoading(true);
try { try {
onDiscordOAuthClicked(status.discord_client_id); onDiscordOAuthClicked(status.discord_client_id, { shouldLogout: true });
} finally { } finally {
setTimeout(() => setDiscordLoading(false), 3000); setTimeout(() => setDiscordLoading(false), 3000);
} }
@@ -279,7 +279,12 @@ const RegisterForm = () => {
const handleOIDCClick = () => { const handleOIDCClick = () => {
setOidcLoading(true); setOidcLoading(true);
try { try {
onOIDCClicked(status.oidc_authorization_endpoint, status.oidc_client_id); onOIDCClicked(
status.oidc_authorization_endpoint,
status.oidc_client_id,
false,
{ shouldLogout: true },
);
} finally { } finally {
setTimeout(() => setOidcLoading(false), 3000); setTimeout(() => setOidcLoading(false), 3000);
} }
@@ -288,7 +293,7 @@ const RegisterForm = () => {
const handleLinuxDOClick = () => { const handleLinuxDOClick = () => {
setLinuxdoLoading(true); setLinuxdoLoading(true);
try { try {
onLinuxDOOAuthClicked(status.linuxdo_client_id); onLinuxDOOAuthClicked(status.linuxdo_client_id, { shouldLogout: true });
} finally { } finally {
setTimeout(() => setLinuxdoLoading(false), 3000); setTimeout(() => setLinuxdoLoading(false), 3000);
} }

View File

@@ -231,8 +231,22 @@ export async function getOAuthState() {
} }
} }
export async function onDiscordOAuthClicked(client_id) { async function prepareOAuthState(options = {}) {
const state = await getOAuthState(); 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; if (!state) return;
const redirect_uri = `${window.location.origin}/oauth/discord`; const redirect_uri = `${window.location.origin}/oauth/discord`;
const response_type = 'code'; const response_type = 'code';
@@ -242,8 +256,13 @@ export async function onDiscordOAuthClicked(client_id) {
); );
} }
export async function onOIDCClicked(auth_url, client_id, openInNewTab = false) { export async function onOIDCClicked(
const state = await getOAuthState(); auth_url,
client_id,
openInNewTab = false,
options = {},
) {
const state = await prepareOAuthState(options);
if (!state) return; if (!state) return;
const url = new URL(auth_url); const url = new URL(auth_url);
url.searchParams.set('client_id', client_id); 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) { export async function onGitHubOAuthClicked(github_client_id, options = {}) {
const state = await getOAuthState(); const state = await prepareOAuthState(options);
if (!state) return; if (!state) return;
window.open( window.open(
`https://github.com/login/oauth/authorize?client_id=${github_client_id}&state=${state}&scope=user:email`, `https://github.com/login/oauth/authorize?client_id=${github_client_id}&state=${state}&scope=user:email`,
); );
} }
export async function onLinuxDOOAuthClicked(linuxdo_client_id) { export async function onLinuxDOOAuthClicked(
const state = await getOAuthState(); linuxdo_client_id,
options = { shouldLogout: false },
) {
const state = await prepareOAuthState(options);
if (!state) return; if (!state) return;
window.open( window.open(
`https://connect.linux.do/oauth2/authorize?response_type=code&client_id=${linuxdo_client_id}&state=${state}`, `https://connect.linux.do/oauth2/authorize?response_type=code&client_id=${linuxdo_client_id}&state=${state}`,