本篇将提供以下问题的解决方案:
- 如何在云函数中便捷得读写 Cookie?
- 在 Serverless 中如何存储和使用 Session?
- 如何使用入参校验来避免恶意攻击?
如何在云函数中便捷得读写 Cookie?
原生云函数是通过 Context 中的 headers 来传入 cookie 信息,通过返回 headers 的 set-cookie 来写入 cookie,这种方式显然对于开发者来说不够友好,所以 FaasJS 将其读写操作封装到了 @faasjs/http 插件中,可以通过如下方式来读写 cookie:
import { Func } from '@faasjs/func';
import { Http } from '@faasjs/http';
const http = new Http(); // 创建 http 插件实例
export default new Func({
plugins: [http], // 将 http 插件实例放到云函数的插件中
async handler(){
console.log(http.cookie.read('key')); // 读取 cookie
http.cookie.write('key', 'value'); // 写入 cookie
}
});
在 Serverless 中如何存储和使用 Session?
在 Serverless 场景下,每个云函数都是相互独立的,若统一处理 Session 会造成较大的性能损耗。
因此为了使各个云函数能独自处理 Session 信息,推荐将 Session 加密存储于 Cookie 中,并且为了避免 Cookie 信息过多,建议仅存储必须的信息,如 user_id 之类。
Session 使用示例如下:
import { Func } from '@faasjs/func';
import { Http } from '@faasjs/http';
const http = new Http();
export default new Func({
plugins: [http],
handler(){
// 将 session 中的 distinct_id 写入为 user_id
http.session.write('user_id', http.session.read('distinct_id'));
}
});
入参校验
随着网络安全变得越来越重要,FaasJS 中也内置了入参校验来避免一些攻击行为。入参校验主要支持以下功能:
- 支持校验请求参数、Cookie 和 Session;
- 支持入参白名单配置,当遇到非白名单中的入参时,可以报错或删除;
- 校验规则包括:必填校验、类型校验、枚举值校验、设定默认值;
- 校验规则支持多层校验,用于校验 object 和 array 类型。
代码示例如下:
const http = new Http({
validator: { // 配置入参校验
params: { // 校验请求参数
whitelist: 'error', // 若发现非白名单入参就报错
rules: { // 每个参数的校验规则
key: { // 参数名
required: true, // 必填
type: 'object', // 参数类型
config: { // 多层校验
whitelist: 'error',
rules: {
subKey: { // 参数名
in: [1, 2], // 枚举值校验
default: 1 // 设定默认值
}
}
}
}
}
}
}
});
由于入参校验功能支持 Session,因此可以以此来进行简单的鉴权。比如对 Session 中的 user_id 进行必填校验,来判断用户是否已登录。