Kaynağa Gözat

♻️ refactor(auth): 重构登录逻辑,封装token登录方法

- 从handleLogin中提取token登录逻辑,创建handleTokenLogin方法实现复用
- AuthContextType添加loginWithToken方法定义
- WechatCallbackPage使用loginWithToken替代直接调用login方法
- 移除WechatCallbackPage中重复的localStorage.setItem('token')调用,统一由handleTokenLogin处理

✨ feat(auth): 添加loginWithToken接口,支持直接使用token登录

- AuthProvider暴露loginWithToken方法,供第三方登录场景使用
- 统一token处理逻辑,包括设置请求头、保存状态和本地存储
yourname 6 ay önce
ebeveyn
işleme
4ee1eecbb6

+ 15 - 8
src/client/mobile/hooks/AuthProvider.tsx

@@ -99,14 +99,8 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
       // 保存token和用户信息
       const { token: newToken, user: newUser } = result;
 
-      // 设置全局默认请求头
-      axios.defaults.headers.common['Authorization'] = `Bearer ${newToken}`;
-
-      // 保存状态
-      setToken(newToken);
-      setUser(newUser);
-      setIsAuthenticated(true);
-      localStorage.setItem('mobile_token', newToken);
+      // 使用token登录
+      await handleTokenLogin(newToken, newUser);
       return newUser;
     } catch (error) {
       console.error('登录失败:', error);
@@ -114,12 +108,25 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
     }
   };
 
+  // 处理token登录逻辑(单独封装复用)
+  const handleTokenLogin = async (newToken: string, newUser: User): Promise<void> => {
+    // 设置全局默认请求头
+    axios.defaults.headers.common['Authorization'] = `Bearer ${newToken}`;
+
+    // 保存状态
+    setToken(newToken);
+    setUser(newUser);
+    setIsAuthenticated(true);
+    localStorage.setItem('mobile_token', newToken);
+  };
+
   return (
     <AuthContext.Provider
       value={{
         user,
         token,
         login: handleLogin,
+        loginWithToken: handleTokenLogin,
         logout: handleLogout,
         isAuthenticated,
         isLoading

+ 4 - 5
src/client/mobile/pages/WechatCallbackPage.tsx

@@ -9,7 +9,7 @@ const WechatCallbackPage: React.FC = () => {
   const [message, setMessage] = useState<string>('处理中...');
   const navigate = useNavigate();
   const [searchParams] = useSearchParams();
-  const { login } = useAuth();
+  const { loginWithToken } = useAuth();
 
   useEffect(() => {
     const handleWechatCallback = async () => {
@@ -33,9 +33,8 @@ const WechatCallbackPage: React.FC = () => {
 
         const result = await response.json();
         
-        // 保存token并登录
-        localStorage.setItem('token', result.token);
-        await login(result.user.username, result.token); // 使用token作为密码进行登录
+        // 使用token登录(复用封装逻辑)
+        await loginWithToken(result.token, result.user);
         
         setStatus('success');
         setMessage('微信登录成功!');
@@ -62,7 +61,7 @@ const WechatCallbackPage: React.FC = () => {
     };
 
     handleWechatCallback();
-  }, [searchParams, navigate, login]);
+  }, [searchParams, navigate, loginWithToken]);
 
   const getStatusIcon = () => {
     switch (status) {

+ 1 - 0
src/share/types.ts

@@ -9,6 +9,7 @@ export interface AuthContextType<T> {
   user: T | null;
   token: string | null;
   login: (username: string, password: string, latitude?: number, longitude?: number) => Promise<T>;
+  loginWithToken: (token: string, user: T) => Promise<void>;
   logout: () => Promise<void>;
   isAuthenticated: boolean;
   isLoading: boolean;