인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

gga01075님의 프로필 이미지
gga01075

작성한 질문수

맛집 지도앱 만들기 (React Native + NestJS)

[3-8] React Query 도입(2) - 로그인 연동하기

useAuth logout 401에러

작성

·

28

0

image.png

안녕하세요 강사님!
강사님께서 해당 강의에서 작성해주신대로
우선 Database와 백엔드서버를 구동시킨 채로 프론트엔드 서버를 npx react-native run-ios로 어플을 빌드하고

로그아웃 버튼을 클릭했을때 위의 이미지와 같이 401에러가 발생합니다.

제가 작성한 코드를 보여드리면

  1. src/hooks/queries/useAuth.ts

     

    
    function useLogout(mutationOptions?: UseMutationCustomOptions) {
      return useMutation({
        mutationFn: logout,
        onSuccess: () => {
          console.log('useLogout onSuccess');
    
          removeHeader('Authorization');
          removeEncryptStorage(storageKeys.REFRESH_TOKEN);
        },
        onSettled: () => {
          // auth에 해당하는 쿼리들을 캐시 무효화해서 업데이트
          queryClient.invalidateQueries({queryKey: [queryKeys.AUTH]});
        },
        ...mutationOptions,
      });
    }
    
    function useAuth() {
      const logoutMutation = useLogout();
    
      return {
        logoutMutation,
      };
    }
    
    export default useAuth;
    
  2. src/api/auth.ts

const logout = async () => {
  console.log('logout API call');
  try {
    await axiosInstance.post('/auth/logout');
  } catch (err) {
    console.error(`logout api err :::: ${err}`);
  }
};

export { logout };


3. src/api/axios.ts

import axios from 'axios';

const axiosInstance = axios.create({
  baseURL: 'http://localhost:3030',
  withCredentials: true,
});

export default axiosInstance;
  1. src/utils/header.ts

import axiosInstance from '../api/axios';

function setHeader(key: string, value: string) {
  axiosInstance.defaults.headers.common[key] = value;
}

function removeHeader(key: string) {
  if (!axiosInstance.defaults.headers.common[key]) {
    return;
  }

  delete axiosInstance.defaults.headers.common[key];
}

export {setHeader, removeHeader};
  1. src/screens/map/MapHomeScreen.tsx

import React from 'react';
import {Button, StyleSheet, Text, View} from 'react-native';
import useAuth from '../../hooks/queries/useAuth';

const MapHomeScreen = () => {
  const {logoutMutation} = useAuth();

  return (
    <View>
      <Text>맵 스크린</Text>
      <Button title="로그아웃" onPress={() => logoutMutation.mutate(null)} />
    </View>
  );
};

const styles = StyleSheet.create({});

export default MapHomeScreen;

 

 

 

 

 

 

 

답변 2

0

Kyo님의 프로필 이미지
Kyo
지식공유자

8-4 수업 코드를 참고해보시겠어요?

0

안녕하세요, 인프런 AI 인턴입니다.

로그아웃 기능을 구현하는 도중 401 Unauthorized 에러가 발생하는 문제에 대해 설명드리겠습니다. 로그아웃 시 401 에러가 발생하는 원인은 여러 가지가 있으며, 주로 인증 헤더 누락이나 서버측의 인증 처리 문제로 인해 발생할 수 있습니다. 이 문제를 해결하기 위해 다음 사항들을 점검해 보시길 권장드립니다:

  1. 인증 헤더 확인:

    • 로그아웃 API를 호출할 때 서버가 적절한 인증 헤더, 즉 Authorization 헤더가 포함된 요청을 요구하지 않는지 확인하시기 바랍니다. 로그아웃 시 인증이 필요하다면 로그아웃 호출 전에 헤더를 설정해야 합니다.
  2. Axios 인스턴스 설정:

    • axiosInstance가 생성될 때 baseURL과 함께 인증 관련 설정이 제대로 되어 있는지, 서버가 인증을 필요로 하는 경우 적절한 헤더가 포함되어 있는지 확인합니다.
    • Authorization 헤더가 필요하지 않다면, 로컬 캐시나 스토리지에서도 관련 토큰이 지워지는지 확인해 보세요.
  3. 서버 로그 확인:

    • 서버의 로그를 확인해서 로그아웃 요청이 어떻게 처리되고 있는지 점검해보세요. 서버 측에서 요청을 거부하는 원인을 파악할 수 있습니다(예: 세션 만료, 토큰 유효성 문제 등).
  4. 토큰 유효성:

    • 사용 중인 토큰이 만료되었거나 서버가 이를 유효하지 않다고 인식할 가능성도 있습니다. 최신 토큰을 사용하는지, 로그아웃 전에 유효성을 체크하는 방법도 고려해 보세요.

관련하여 기존에 유사한 문제를 다룬 답변들을 확인하실 수 있습니다:
- 로그아웃 관련해서 질문 있습니다.
- 로그아웃 코드 관련해서 질문드립니다.

위 언급된 항목들을 점검하면서 문제의 원인을 찾고 해결하는 데 도움이 되길 바랍니다. 로그아웃 프로세스 내에서 서버에 적절한 인증 및 인증 해제 요청이 제대로 전달되는지 확인하는 것이 중요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

gga01075님의 프로필 이미지
gga01075

작성한 질문수

질문하기