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

leolearn님의 프로필 이미지
leolearn

작성한 질문수

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

쉬어가기 - Refresh Token 확인 로직

만료된 refreshToken으로 요청할때의 문제, try catch가 작동하지 않는듯?

작성

·

420

0

 

 void checkToken() async {
    final refreshToken = await storage.read(key: REFRESH_TOKEN_KEY);
    final accessToken = await storage.read(key: ACCESS_TOKEN_KEY);

    final dio = Dio();

    try {
      final resp = await dio.post(
        'http://$ip/auth/token',
        options: Options(
          headers: {
            'authorization': 'Bearer $refreshToken',
          },
        ),
      );

      await storage.write(
          key: ACCESS_TOKEN_KEY, value: resp.data['accessToken']);
      // if (!mounted) return;
      Navigator.of(context).pushAndRemoveUntil(
          MaterialPageRoute(
            builder: (_) => const RootTab(),
          ),
          (route) => false);
    } catch (e) {
      print('e: $e');
      // if (!mounted) return;
      Navigator.of(context).pushAndRemoveUntil(
          MaterialPageRoute(
            builder: (_) => const LoginScreen(),
          ),
          (route) => false); // 뒤로가기 버튼을 눌러도 다시 로그인 화면으로 돌아가지 않음
    }
  }

이 로직이 원래 잘됬는데

몇일 사용안하다가 다시키니까

dio.post 부분에서 401에러가 발생하는데

이는 만료된 refreshToken으로 요청해서 발생하는 에러로 예상했습니다.

그런데 try catch로 감쌋기때문에

catch아래 로그인스크린으로 이동하는 로직이 실행되어야 한다고 생각됬는데

예상과 다르게 그냥 앱은 먹통이되고 dio 패키지 내부로 이동되며 401에러를 표시합니다.

임시로 로그인스크린을 강제로 띄워서 다시 토큰을 발행해서 해결했습니다만

왜 이런 상황이 발생하는지 잘이해가 되지않아서 질문드립니다.

답변 1

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

현재 try..catch문을 추가한 부분은 정확한 위치가 맞습니다.

Dio를 포함한 대부분의 HTTP 요청 라이브러리들은 2xx 이외의 상태 코드를 받았을때 에러를 던지게 돼있습니다.

catch에 print() 코드가 잘 실행 되신다면 코드상 문제는 없습니다.

감사합니다!

leolearn님의 프로필 이미지
leolearn
질문자

아 원래 그런거였군요 알려주셔서 감사합니다

강의 내용도 너무 알차서 항상 잘 배우고 있습니다 감사합니다 좋은하루 되세요 !

leolearn님의 프로필 이미지
leolearn

작성한 질문수

질문하기