inblog logo
|
taker
    플러터

    앱 자동로그인 구현

    김인범's avatar
    김인범
    Jan 18, 2025
    앱 자동로그인 구현
    Contents
    자동 로그인 진행전체 코드

    자동 로그인 진행

    대전제: 절대 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

    RSS·Powered by Inblog