JWT (JSON Web Token) — это открытый стандарт для безопасного обмена данными между двумя сторонами. Он состоит из трех частей: заголовка, полезной нагрузки и подписи.
Flutter — это фреймворк для мобильных приложений, который используется для создания кроссплатформенных приложений для iOS и Android.
Шаг 1: Генерация JWT токена
Первым шагом необходимо сгенерировать JWT токен на сервере. Токен может содержать информацию о пользователе, срок его действия и другую полезную информацию. Для генерации токена необходимо использовать библиотеку, которая поддерживает стандарт JWT.
Пример кода на сервере:
import 'package:jwt/json_web_token.dart';
String generateToken() {
final claimSet = JwtClaim(
issuer: 'example.com',
subject: 'userid',
audience: <String>['example.com'],
jwtId: 'id',
otherClaims: <String, dynamic>{
'typ': 'authnresponse',
'pld': {'k': 'v'}
},
);
return issueJwtHS256(claimSet, 'secretKey');
}
Шаг 2: Сохранение JWT токена
После генерации токена, его необходимо сохранить на клиентской стороне. В Flutter для сохранения токена можно использовать пакет flutter_secure_storage, который позволяет сохранять данные безопасно на устройстве.
Пример кода на клиенте:
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
final storage = FlutterSecureStorage();
Future<void> saveToken(String token) async {
await storage.write(key: 'jwt_token', value: token);
}
Шаг 3: Отправка JWT токена на сервер
Для отправки токена на сервер необходимо использовать HTTP-запросы. В Flutter для этого можно использовать пакет http, который позволяет отправлять GET, POST, PUT, DELETE запросы. В запросе необходимо передать токен в заголовке Authorization.
Пример кода на клиенте:
import 'package:http/http.dart' as http;
Future<void> sendToken(String token) async {
final url = Uri.parse('<https://example.com/api>');
final response = await http.post(url, headers: {'Authorization': 'Bearer $token'});
print(response.body);
}
Шаг 4: Восстановление сессии
После отправки токена на сервер, сервер должен его проверить и установить сессию для пользователя. Если токен действителен, то сервер может использовать информацию, содержащуюся в нем, для авторизации пользователя и восстановления сессии.
Пример кода на сервере:
import 'package:jwt/json_web_token.dart';
void validateToken(String token) {
final parts = token.split('.');
final jwt = JsonWebToken.unverified(parts[0], parts[1], parts[2]);
final claims = jwt.claims;
// Validate claims
}
Шаг 5: Обработка ошибок
При использовании JWT токенов необходимо обрабатывать ошибки, связанные с их истечением. Если токен истек, то необходимо запросить новый токен и повторить запрос на сервер.
Пример кода на клиенте:
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
final storage = FlutterSecureStorage();
Future<String> getToken() async {
final token = await storage.read(key: 'jwt_token');
if (token == null) {
throw Exception('Token not found');
}
// Check if token is expired
return token;
}
Заключение
JWT токены и восстановление сессий являются важными компонентами безопасности в приложениях на Flutter. Их использование позволяет обеспечить безопасность пользовательских данных и защитить приложение от злоумышленников.