Flutter安全存储Cookie插件shelf_secure_cookie的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter安全存储Cookie插件shelf_secure_cookie的使用

简介

shelf_secure_cookie 是一个基于 shelf_cookie 包的扩展,它添加了异步的 setEncryptedgetEncrypted 方法,支持使用 AES-GCM 加密和摘要来存储敏感数据。这些方法要求一个 32 字节的密钥。

示例代码

以下是一个完整的示例 demo,展示了如何使用 shelf_secure_cookie 插件来安全地存储和读取 Cookie。

import 'dart:io';

import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_cookie/shelf_secure_cookie.dart';

void main() {
  // 使用你的 32 字节安全密钥在中间件构造期间
  // 不要在源代码中保存此密钥
  // 可以考虑如下方式加载:
  // final secretKey = myConfig.load('config.json').secretKey
  // 并将 config.json 添加到 .gitignore 中
  final secretKey = "12345678901234567890123456789012";
  
  var handler = const shelf.Pipeline()
      .addMiddleware(cookieParser(secretKey)) // 使用带有密钥的 cookieParser 中间件
      .addHandler((req) async {
    // 获取请求中的 Cookie 解析器
    CookieParser cookies = req.context['cookies'] as CookieParser;

    // 检查是否存在名为 'ping' 的 Cookie
    if (cookies.get('ping') != null) {
      // 清除所有现有的 Cookies
      cookies.clear(); // 或者创建一个新的实例:cookies = CookieParser();
      
      // 设置加密后的 Cookie,secure: true 表示仅通过 HTTPS 发送
      cookies.setEncrypted('pong', 'bar', secure: true, httpOnly: true);
    }

    // 响应中将会设置 Cookie 头
    // e.g. 'set-cookie': 'pong=someencryptedandsignedvalue; Secure; HttpOnly'
    return shelf.Response.ok('check your cookies');
  });

  // 启动服务器监听在 localhost:8080
  io.serve(handler, 'localhost', 8080).then((server) {
    print('Serving at http://${server.address.host}:${server.port}');
  });
}

更多关于Flutter安全存储Cookie插件shelf_secure_cookie的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全存储Cookie插件shelf_secure_cookie的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用shelf_secure_cookie插件来安全存储Cookie的示例。需要注意的是,shelf_secure_cookie实际上是一个Dart库,通常用于Dart的后端服务(如使用Shelf框架的服务器应用),而不是直接在Flutter前端应用中使用。Flutter前端通常不会直接使用这种库来存储Cookie,而是依赖于HTTP客户端库和操作系统的安全存储机制。

不过,为了展示如何在Dart后端中使用shelf_secure_cookie来安全存储和验证Cookie,这里提供一个简单的服务器示例。这个示例将展示如何设置一个Shelf服务器,并使用shelf_secure_cookie来签名和验证Cookie。

步骤1:添加依赖

首先,在你的pubspec.yaml文件中添加shelfshelf_secure_cookie的依赖:

dependencies:
  shelf: ^1.0.0
  shelf_secure_cookie: ^1.0.0

然后运行dart pub get来安装这些依赖。

步骤2:编写服务器代码

下面是一个简单的Dart服务器示例,它使用shelfshelf_secure_cookie来处理Cookie:

import 'dart:convert';
import 'package:shelf/shelf.dart';
import 'package:shelf_secure_cookie/shelf_secure_cookie.dart';
import 'package:shelf_router/shelf_router.dart';

void main() async {
  final secretKey = 'your-secret-key-here'; // 请使用一个安全的密钥
  final cookieSigner = new SecureCookie.signer(secretKey);

  final router = Router();

  router.get('/set-cookie', (Request request) async {
    final response = Response.ok()
      ..setCookie(new SetCookie.fromMap({
        'name': 'session_id',
        'value': '12345', // 假设这是用户的会话ID
        'path': '/',
        'httpOnly': true, // 防止JavaScript访问
        'secure': true,   // 仅通过HTTPS发送
        'signed': true,   // 使用签名
        'sameSite': 'lax' // 防止CSRF攻击
      }, cookieSigner: cookieSigner));
    return response;
  });

  router.get('/verify-cookie', (Request request) async {
    final cookies = request.cookies;
    final sessionId = cookies['session_id']?.value;

    if (sessionId != null) {
      try {
        final verifiedValue = await cookieSigner.verify(sessionId);
        return Response.ok(body: 'Verified session ID: $verifiedValue');
      } catch (_) {
        return Response.badRequest(body: 'Invalid or tampered cookie');
      }
    } else {
      return Response.notFound(body: 'No session ID cookie found');
    }
  });

  final handler = Router.handler(router);

  final server = await shelf.serve(handler, 'localhost', 8080);

  print('Serving at http://${server.address.host}:${server.address.port}');
}

解释

  1. 依赖导入:导入了shelfshelf_secure_cookieshelf_router库。
  2. 密钥设置:设置了一个用于签名和验证Cookie的密钥(请确保在生产环境中使用安全的密钥)。
  3. 路由设置
    • /set-cookie:设置一个名为session_id的Cookie,并对其进行签名。
    • /verify-cookie:验证session_id Cookie的有效性,并返回验证结果。
  4. 服务器启动:在本地8080端口启动Shelf服务器。

注意事项

  • 安全性:确保secretKey足够复杂且保密,不要将其硬编码在源代码中。
  • HTTPSsecure: true选项要求通过HTTPS发送Cookie。在本地测试时,你可能需要配置一个自签名证书或使用工具如ngrok来暴露HTTPS端点。
  • Cookie属性httpOnlysameSite属性有助于增强Cookie的安全性。

这个示例展示了如何在Dart后端服务中使用shelf_secure_cookie来安全地处理Cookie。对于Flutter前端应用,通常会依赖Flutter的HTTP客户端库(如diohttpclient)来处理Cookie,并结合操作系统的安全存储机制来保护敏感信息。

回到顶部