자동 로그인 진행
대전제: 절대 SessionUser가 있을 수 없다.
- 디바이스에 저장되어 있는 토큰 가져오기
- 토큰 서버에 넘겨서 확인시켜주기
- 응답으로 받은 유저 정보 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