Сохранение авторизации во Flutter
Вопрос в следующем:
Имеются endpoitы на сервере, доступ к которым происходит через Basic auth.
Например, для доступа к списку постов делается get запрос к /api/posts и передается заголовок Authorization : base64Encode<userlogin,userpass>.
В случае успеха 200 статускод как обычно, в случае неудачи код 40*.
Пример кода
// Кодируем данные
String base64Auth = stringToBase64.encode("${login}:${password}");
http.get(
url,
headers: {
"Content-Type": "application/json",
"Authorization": "Basic $base64Auth"
},
).then((http.Response response) {
final int statusCode = response.statusCode;
// В случае успеха нужно как-то запомнить пользователя,
// чтобы после перезапуска приложения авторизация сохранилась
if (statusCode == 200) {
// Эта переменная сбросится в начальное состояние (false) после перезапуска
isLoggedIn = true;
Navigator.pushNamedAndRemoveUntil(
context, Constants.ROUTE_HOME, (route) => false);
} else {
return 'Ошибка авторизации. Проверьте логин и пароль';
}
}).catchError((err) {
//Отправка ошибки на сервер
return 'Неизвестная ошибка.';
});
В общем вопрос, как реализовать нечто наподобие cookies на flutter.
Ответы (1 шт):
Автор решения: MiT
→ Ссылка
Вот так можно получить cookie (или с помощью библиотеки CookieJar):
String base64Auth = stringToBase64.encode("${login}:${password}");
Map<String, String> headers = {
"Content-Type": "application/json",
"Authorization": "Basic $base64Auth"
};
http.get(url, headers: headers).then((http.Response response) {
if (response.statusCode == 200) {
cookie(response);
Navigator.pushNamedAndRemoveUntil(
context, Constants.ROUTE_HOME, (route) => false);
} else {
return 'Ошибка авторизации. Проверьте логин и пароль';
}
}).catchError((err) {
return 'Неизвестная ошибка.';
});
void cookie(http.Response response) {
String rawCookie = response.headers['set-cookie'];
if (rawCookie != null) {
int index = rawCookie.indexOf(';');
headers['cookie'] = (index == -1) ? rawCookie : rawCookie.substring(0, index);
}
}
Но для того чтобы использовать их после перезапуска приложения, необходимо сохронять эти данные. Для этого можно использовать: shared_preferences, hive, sqflite и т.д.