Рубрики
Flutter

Использование JWT токенов во Flutter

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. Их использование позволяет обеспечить безопасность пользовательских данных и защитить приложение от злоумышленников.