Skip to content

Commit 6ebf6bf

Browse files
authored
Merge pull request #25 from next-engineer/feature/24-auth-me-flow
로그인 직후 유저 정보 추가/수정
2 parents 6f889d9 + 40af181 commit 6ebf6bf

File tree

4 files changed

+34
-8
lines changed

4 files changed

+34
-8
lines changed

src/api/userApi.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { api } from './axiosInstance';
22
import type { User } from '../types';
33

4-
// API: GET /api/users/me
5-
// (Authorization: Bearer <access_token>)
6-
export async function fetchMyProfile(): Promise<User> {
7-
const { data } = await api.get<User>('/api/users/me');
4+
export async function postUserMe(): Promise<void> {
5+
await api.post('users/me', null);
6+
}
7+
8+
export async function getMyProfile(): Promise<User> {
9+
const { data } = await api.get<User>('users/me');
810
return data;
911
}

src/auth/callback.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { COGNITO } from './config';
2+
import { useAuthStore } from '../store/useAuthStore';
3+
import { postUserMe, getMyProfile } from '../api/userApi';
24

35
export type TokenResponse = {
46
id_token: string;
@@ -45,11 +47,22 @@ export async function handleAuthCallback(): Promise<TokenResponse | null> {
4547

4648
if (!res.ok) throw new Error(json.error_description ?? 'Token exchange failed');
4749

48-
localStorage.setItem('id_token', json.id_token);
49-
localStorage.setItem('access_token', json.access_token);
50-
if (json.refresh_token) localStorage.setItem('refresh_token', json.refresh_token);
50+
useAuthStore.getState().setTokens({
51+
idToken: json.id_token ?? null,
52+
accessToken: json.access_token ?? null,
53+
refreshToken: json.refresh_token ?? null,
54+
});
5155

5256
sessionStorage.removeItem('pkce_verifier');
57+
58+
try {
59+
await postUserMe();
60+
const me = await getMyProfile();
61+
useAuthStore.getState().setUser(me);
62+
} catch (e) {
63+
console.error('[callback] user sync failed', e);
64+
}
65+
5366
// code 제거 (새로고침 시 재호출 방지)
5467
window.history.replaceState({}, '', COGNITO.redirectUri);
5568

src/auth/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ export const COGNITO: CognitoConfig = {
1717
hostedUiDomain: requireEnv('VITE_COGNITO_DOMAIN'),
1818
clientId: requireEnv('VITE_COGNITO_CLIENT_ID'),
1919
redirectUri: requireEnv('VITE_COGNITO_REDIRECT_URI'),
20-
scopes: ['openid', 'email'],
20+
scopes: ['openid', 'email', 'profile'],
2121
};

src/store/useAuthStore.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ interface AuthState {
2424
setTokens: (tokens: Tokens) => void;
2525
syncFromStorage: () => void;
2626
clearTokens: () => void;
27+
28+
// [추가] /user/me 응답을 전역에 반영하기 위한 액션
29+
setUser: (_user: User | null) => void; // ← [추가]
2730
}
2831

2932
// Mock users (기존 유지)
@@ -96,6 +99,11 @@ export const useAuthStore = create<AuthState>((set, get) => ({
9699

97100
// 추가: 교환 결과를 직접 세팅하고 싶을 때 사용 가능
98101
setTokens: (tokens: Tokens) => {
102+
// [수정] 새로고침 유지 위해 로컬스토리지에도 반영
103+
localStorage.setItem('id_token', tokens.idToken ?? '');
104+
localStorage.setItem('access_token', tokens.accessToken ?? '');
105+
localStorage.setItem('refresh_token', tokens.refreshToken ?? '');
106+
99107
set({
100108
tokens,
101109
isAuthenticated: Boolean(tokens.accessToken),
@@ -123,6 +131,9 @@ export const useAuthStore = create<AuthState>((set, get) => ({
123131
isAuthenticated: false,
124132
});
125133
},
134+
135+
// [추가] /user/me 결과 반영
136+
setUser: (_user) => set({ user: _user }), // ← [추가]
126137
}));
127138

128139
// 기존 유지

0 commit comments

Comments
 (0)