앱 자동로그인 구현

김인범's avatar
Jan 18, 2025
앱 자동로그인 구현

자동 로그인 진행

대전제: 절대 SessionUser가 있을 수 없다.

  1. 디바이스에 저장되어 있는 토큰 가져오기
  1. 토큰 서버에 넘겨서 확인시켜주기
  1. 응답으로 받은 유저 정보 Session에 갱신시키기
 

디바이스에서 토큰 가져오기

I/O 까지 가는 것을 시간이 걸린다 >> 동기화 진행시키기
String? accessToken = await secureStorage.read(key: "accessToken");
 
기존 토큰 있는지 확인
secureStorage를 사용해서 secureStorage.read(key: "accessToken");를 읽어낸다.
없을 경우>> 로그인 페이지로 이동
if (accessToken == null) { Navigator.popAndPushNamed(mContext, "/login"); return; }
 

통신

있다면 토큰을 서버에 날린다.
Map<String, dynamic> responseBody = await userRepo.autoLogin(accessToken);
Future<Map<String, dynamic>> autoLogin(String accessToken) async { Response response = await dio.post( "/auto/login", options: Options(headers: {"Authorization": accessToken}), ); Map<String, dynamic> body = response.data; return body; }
통신할 때 서버에 Dio의 options→headers에 넣어서 보냅니다.
 

통신으로 응답이 오면

통신이 200으로 안오는 경우 처리
if (!responseBody["success"]) { Navigator.popAndPushNamed(mContext, "/login"); return; }
 
response에서 바디 데이터 꺼내서 User정보 갱신
Map<String, dynamic> data = responseBody["response"]; state = SessionUser( id: data["id"], username: data["username"], accessToken: accessToken, isLogin: true);
다시 토큰 Dio 헤더에 담아주기
dio.options.headers = {"Authorization": accessToken};
화면 이동
Navigator.popAndPushNamed(mContext, "/post/list");
 

전체 코드

gvm
// 1. 절대 SessionUser가 있을 수 없다. Future<void> autoLogin() async { // 1. 토큰 디바이스에서 가져오기 String? accessToken = await secureStorage.read(key: "accessToken"); if (accessToken == null) { Navigator.popAndPushNamed(mContext, "/login"); return; } Map<String, dynamic> responseBody = await userRepo.autoLogin(accessToken); if (!responseBody["success"]) { Navigator.popAndPushNamed(mContext, "/login"); return; } Map<String, dynamic> data = responseBody["response"]; state = SessionUser( id: data["id"], username: data["username"], accessToken: accessToken, isLogin: true); dio.options.headers = {"Authorization": accessToken}; Navigator.popAndPushNamed(mContext, "/post/list"); }
repository
Future<Map<String, dynamic>> autoLogin(String accessToken) async { Response response = await dio.post( "/auto/login", options: Options(headers: {"Authorization": accessToken}), ); Map<String, dynamic> body = response.data; return body; }
Share article

taker