login test

This commit is contained in:
focp212@naver.com
2025-10-13 17:46:10 +09:00
parent 6d4f2c749e
commit e9758f2240
3 changed files with 67 additions and 124 deletions

View File

@@ -1,49 +1,69 @@
import { LoginParams } from '@/entities/user/model/types'; import { LoginParams, LoginResponse } from '@/entities/user/model/types';
import { StorageKeys } from '@/shared/constants/local-storage'; import { StorageKeys } from '@/shared/constants/local-storage';
import { setLocalStorage } from '@/shared/lib/web-view-bridge'; import { setLocalStorage } from '@/shared/lib/web-view-bridge';
import { useLoginMutation } from '@/entities/user/api/use-login-mutation'; import { useLoginMutation } from '@/entities/user/api/use-login-mutation';
import { useStore } from '~/shared/model/store'; import { useStore } from '~/shared/model/store';
import { useAppBridge } from '@/hooks';
export const useUserInfo = () => { export const useUserInfo = () => {
const { mutateAsync: login } = useLoginMutation(); const { mutateAsync: login } = useLoginMutation();
const callLogin = async (params: LoginParams) => { const {
isNativeEnvironment,
requestToken,
logout
} = useAppBridge();
const callLogin = async (params?: LoginParams) => {
try{ try{
useStore.getState().UserStore.resetUserInfo(); useStore.getState().UserStore.resetUserInfo();
const result = await login(params); if(isNativeEnvironment){
if(result.requires2FA){ const result: LoginResponse = await requestToken();
// 2차인증 필요 if(!result) {
// 토큰이 null인 경우 로그아웃 처리
} console.error('Token is null, performing logout');
else{ useStore.getState().UserStore.resetUserInfo();
const { logout();
tokenType, return;
accessToken, }
refreshToken, setLocalStorage(StorageKeys.TokenType, result.tokenType);
accessTokenExpiresIn, setLocalStorage(StorageKeys.AccessToken, result.accessToken);
refreshTokenExpiresIn, setLocalStorage(StorageKeys.RefreshToken, result.refreshToken);
menuGrants, setLocalStorage(StorageKeys.AccessTokenExpiresIn, result.accessTokenExpiresIn);
clientAddressIP, setLocalStorage(StorageKeys.RefreshTokenExpiresIn, result.refreshTokenExpiresIn);
requires2FA setLocalStorage(StorageKeys.MenuGrants, result.menuGrants);
} = result; setLocalStorage(StorageKeys.ClientAddressIP, result.clientAddressIP);
setLocalStorage(StorageKeys.TokenType, tokenType); setLocalStorage(StorageKeys.Requires2FA, result.requires2FA);
setLocalStorage(StorageKeys.AccessToken, accessToken); setLocalStorage(StorageKeys.Usrid, result.usrid);
setLocalStorage(StorageKeys.RefreshToken, refreshToken);
setLocalStorage(StorageKeys.AccessTokenExpiresIn, accessTokenExpiresIn);
setLocalStorage(StorageKeys.RefreshTokenExpiresIn, refreshTokenExpiresIn);
setLocalStorage(StorageKeys.MenuGrants, menuGrants);
setLocalStorage(StorageKeys.Usrid, params.id);
setLocalStorage(StorageKeys.ClientAddressIP, clientAddressIP);
setLocalStorage(StorageKeys.Requires2FA, requires2FA);
useStore.getState().UserStore.setUserInfo({ useStore.getState().UserStore.setUserInfo({
...result, ...result
usrid: params.id
}); });
} }
} else{
catch(e: any){ // 개발용 ...
if(params){
const result = await login(params);
setLocalStorage(StorageKeys.TokenType, result.tokenType);
setLocalStorage(StorageKeys.AccessToken, result.accessToken);
setLocalStorage(StorageKeys.RefreshToken, result.refreshToken);
setLocalStorage(StorageKeys.AccessTokenExpiresIn, result.accessTokenExpiresIn);
setLocalStorage(StorageKeys.RefreshTokenExpiresIn, result.refreshTokenExpiresIn);
setLocalStorage(StorageKeys.MenuGrants, result.menuGrants);
setLocalStorage(StorageKeys.ClientAddressIP, result.clientAddressIP);
setLocalStorage(StorageKeys.Requires2FA, result.requires2FA);
setLocalStorage(StorageKeys.Usrid, params.id);
useStore.getState().UserStore.setUserInfo({
...result,
usrid: params.id
});
}
}
}
catch(error: any){
console.error('Failed to request token:', error);
useStore.getState().UserStore.resetUserInfo();
logout();
} }
}; };
return { return {

View File

@@ -1,6 +1,7 @@
import { useState, useEffect, useCallback } from 'react'; import { useState, useEffect, useCallback } from 'react';
import { appBridge } from '@/utils/appBridge'; import { appBridge } from '@/utils/appBridge';
import { DeviceInfo, ShareContent } from '@/types'; import { DeviceInfo, ShareContent } from '@/types';
import { LoginResponse } from '@/entities/user/model/types';
interface UseAppBridgeReturn { interface UseAppBridgeReturn {
isNativeEnvironment: boolean; isNativeEnvironment: boolean;
@@ -42,7 +43,7 @@ interface UseAppBridgeReturn {
logout: () => Promise<void>; logout: () => Promise<void>;
// 토큰 요청 // 토큰 요청
requestToken: () => Promise<any>; requestToken: () => Promise<LoginResponse>;
requestRefreshToken: () => Promise<any>; requestRefreshToken: () => Promise<any>;
// 간편 인증 등록 // 간편 인증 등록
@@ -241,14 +242,7 @@ export const useAppBridge = (): UseAppBridgeReturn => {
showAlert, showAlert,
showConfirm, showConfirm,
setStorage, setStorage,
// getStorage,
removeStorage, removeStorage,
/*
openCamera,
openGallery,
getLocation,
getContacts,
*/
shareContent, shareContent,
logout, logout,
requestToken, requestToken,

View File

@@ -31,7 +31,6 @@ export interface ContextType {
}; };
export const SubLayout = () => { export const SubLayout = () => {
const { reload } = useNavigate();
useScrollToTop(); useScrollToTop();
const [onBack, setOnBack] = useState(undefined); const [onBack, setOnBack] = useState(undefined);
const [headerTitle, setHeaderTitle] = useState<string>(''); const [headerTitle, setHeaderTitle] = useState<string>('');
@@ -44,61 +43,13 @@ export const SubLayout = () => {
const [headerNavigationKey, setHeaderNavigationKey] = useState<number>(1); const [headerNavigationKey, setHeaderNavigationKey] = useState<number>(1);
const { callLogin } = useUserInfo(); const { callLogin } = useUserInfo();
const {
isNativeEnvironment, const { isNativeEnvironment } = useAppBridge();
openBiometricRegistrationPopup,
requestToken,
logout
} = useAppBridge();
const { mutateAsync: homeGroups } = useHomeGroupsMutation(); const { mutateAsync: homeGroups } = useHomeGroupsMutation();
const [loginSuccess, setLoginSuccess] = useState<boolean>(false); const [loginSuccess, setLoginSuccess] = useState<boolean>(false);
const wrapperClassName = 'wrapper'; const wrapperClassName = 'wrapper';
const handleRequestToken = useCallback(async () =>{
requestToken().then((token) => {
if(!token) {
// 토큰이 null인 경우 로그아웃 처리
console.error('Token is null, performing logout');
useStore.getState().UserStore.resetUserInfo();
setLoginSuccess(false);
logout();
return;
}
console.log('token ' + JSON.stringify(token));
setLocalStorage(StorageKeys.Usrid, token.usrid);
setLocalStorage(StorageKeys.TokenType, token.tokenType);
setLocalStorage(StorageKeys.AccessToken, token.accessToken);
setLocalStorage(StorageKeys.RefreshToken, token.refreshToken);
setLocalStorage(StorageKeys.AccessTokenExpiresIn, token.accessTokenExpiresIn);
setLocalStorage(StorageKeys.RefreshTokenExpiresIn, token.refreshTokenExpiresIn);
setLocalStorage(StorageKeys.MenuGrants, token.menuGrants);
setLocalStorage(StorageKeys.ClientAddressIP, token.clientAddressIP);
setLocalStorage(StorageKeys.Requires2FA, token.requires2FA);
useStore.getState().UserStore.setUserInfo({
usrid: token.usrid,
tokenType: token.tokenType,
accessToken: token.accessToken,
refreshToken: token.refreshToken,
accessTokenExpiresIn: token.accessTokenExpiresIn,
refreshTokenExpiresIn: token.refreshTokenExpiresIn,
menuGrants: token.menuGrants,
clientAddressIP: token.clientAddressIP,
requires2FA: token.requires2FA,
});
callHomeGroups();
}).catch((error) => {
// 토큰 요청 실패 시 로그아웃 처리
console.error('Failed to request token:', error);
useStore.getState().UserStore.resetUserInfo();
setLoginSuccess(false);
logout();
});
}, []);
const callHomeGroups = () => { const callHomeGroups = () => {
let userInfo = useStore.getState().UserStore.userInfo; let userInfo = useStore.getState().UserStore.userInfo;
let params: HomeGroupsParams = { let params: HomeGroupsParams = {
@@ -120,49 +71,27 @@ export const SubLayout = () => {
setLoginSuccess(true); setLoginSuccess(true);
setHeaderNavigationKey(headerNavigationKey + 1); setHeaderNavigationKey(headerNavigationKey + 1);
reLogin();
}); });
}; };
const reLogin = () => {
console.log('reLogin');
let userInfo = useStore.getState().UserStore.userInfo;
if(userInfo.accessTokenExpiresIn){
let accessTokenExpiresIn = userInfo.accessTokenExpiresIn;
let timer = setTimeout(() => {
if(isNativeEnvironment){
handleRequestToken();
}
else{
handleLogin();
}
}, accessTokenExpiresIn * 1000);
}
};
const handleLogin = useCallback(async () => { const handleLogin = useCallback(async () => {
const userParmas = { let userParmas;
id: 'nictest00', if(!isNativeEnvironment){
password: 'nictest00' userParmas = {
}; id: 'nictest00',
password: 'nictest00'
};
}
callLogin(userParmas).then(() => { callLogin(userParmas).then(() => {
callHomeGroups(); callHomeGroups();
}).catch((error: any) => {
setLoginSuccess(false);
}); });
}, []); }, []);
const tokenTimeCheck = () => {
}
useEffect(() => { useEffect(() => {
console.log('isNativeEnvironment : ['+isNativeEnvironment+']'); handleLogin();
if(isNativeEnvironment){
handleRequestToken();
}
else{
handleLogin();
}
}, []); }, []);
return ( return (