Flutter安全存储Cookie插件shelf_secure_cookie的使用
Flutter安全存储Cookie插件shelf_secure_cookie的使用
简介
shelf_secure_cookie
是一个基于 shelf_cookie
包的扩展,它添加了异步的 setEncrypted
和 getEncrypted
方法,支持使用 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
更多关于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
文件中添加shelf
和shelf_secure_cookie
的依赖:
dependencies:
shelf: ^1.0.0
shelf_secure_cookie: ^1.0.0
然后运行dart pub get
来安装这些依赖。
步骤2:编写服务器代码
下面是一个简单的Dart服务器示例,它使用shelf
和shelf_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}');
}
解释
- 依赖导入:导入了
shelf
、shelf_secure_cookie
和shelf_router
库。 - 密钥设置:设置了一个用于签名和验证Cookie的密钥(请确保在生产环境中使用安全的密钥)。
- 路由设置:
/set-cookie
:设置一个名为session_id
的Cookie,并对其进行签名。/verify-cookie
:验证session_id
Cookie的有效性,并返回验证结果。
- 服务器启动:在本地8080端口启动Shelf服务器。
注意事项
- 安全性:确保
secretKey
足够复杂且保密,不要将其硬编码在源代码中。 - HTTPS:
secure: true
选项要求通过HTTPS发送Cookie。在本地测试时,你可能需要配置一个自签名证书或使用工具如ngrok
来暴露HTTPS端点。 - Cookie属性:
httpOnly
和sameSite
属性有助于增强Cookie的安全性。
这个示例展示了如何在Dart后端服务中使用shelf_secure_cookie
来安全地处理Cookie。对于Flutter前端应用,通常会依赖Flutter的HTTP客户端库(如dio
或httpclient
)来处理Cookie,并结合操作系统的安全存储机制来保护敏感信息。