Browse Source

fix: Try to fix login error "already logged in" issue

Seefs 1 month ago
parent
commit
d1aaa07ad7

+ 9 - 4
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);

+ 9 - 4
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);
     }

+ 30 - 8
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}`,