@effing/serde (英语)
URL-安全序列化,带有压缩和HMAC签名.
部分 财源 家庭——用TypeScript制作节目视频.
以自动压缩和加密签名的方式将JSON数据序列化为URL安全字符串. 与 Python 兼容 危险。 。 。 .
安装
npm install @effing/serde
快速启动
import { serialize, deserialize } from "@effing/serde";
const secret = process.env.SECRET_KEY!;
const data = { userId: 123, action: "view" };
// Signed (and sometimes compressed) URL segment
const segment = await serialize(data, secret);
// Verify signature (and decompress if needed)
const restored = await deserialize<typeof data>(segment, secret);
概念
URL-安全基础64
标准基数64的使用 + 财务报告和审定财务报表 / 在 URL 有特殊含义。 此软件包使用 URL- safe Base64 :
+→-/→_- 无粘贴( N)
=(中文(简体) )
签名序列化
序列化与 HMAC 签名( 默认 ): sha1),因此结果可以安全地被用在URL中而无需被篡改:
// Server: create signed URL segment
const segment = await serialize(data, secret);
// Client: passes segment in URL
// Server: verify and deserialize
const data = await deserialize(segment, secret);
// Throws if signature is invalid.
压缩
有效载荷在节省空间时被gzip压缩. 压缩后的有效载荷有前缀 "." (比对) itsdangerous) (中文(简体) ).
API 概览
serialize(obj, secretKey, options?)
将一个值序列化为 URL 安全字符串 .
function serialize(
obj: object,
secretKey: string,
options?: {
/** Salt for key derivation (default: "itsdangerous") */
salt?: string;
/** Hash algorithm for HMAC (default: "sha1") */
algorithm?: string;
},
): Promise<string>;
deserialize(segment, secretKey, options?)
将 URL 段切回一个值 .
function deserialize<T = Record<string, unknown>>(
segment: string,
secretKey: string,
options?: {
/** Salt for key derivation (default: "itsdangerous") */
salt?: string;
/** Hash algorithm for HMAC (default: "sha1") */
algorithm?: string;
/** Convert snake_case keys to camelCase (default: true) */
convertKeysToCamel?: boolean;
},
): Promise<T>;
掷出 :
Error- 如果签名验证失败
实例
在 URL 中传递道具
import { serialize, deserialize } from "@effing/serde";
// Create URL with serialized props
const secret = process.env.SECRET_KEY!;
const props = { imageUrl: "https://example.com/image.png", duration: 5 };
const segment = await serialize(props, secret);
const url = `/render/${segment}`;
// In route handler
async function loader({ params }) {
const props = await deserialize(params.segment, secret);
// props = { imageUrl: "https://example.com/image.png", duration: 5 }
}
[注] 这个
convertKeysToCamel淡化选项(即true当 URL 在 Python (具有危险性) 中被构建,然后被 Effing 所消耗时,则有用 。 Python 一般使用snake_case键,而 TypeScript 偏好camelCase。转换是递归性的——嵌入式物体内部的密钥和一系列物体也被转换.
安全键
const SECRET = process.env.TOKEN_SECRET!;
// Create signed token
async function createToken(userId: number, expiresAt: number) {
return serialize({ userId, expiresAt }, SECRET);
}
// Verify token
async function verifyToken(token: string) {
try {
const { userId, expiresAt } = await deserialize(token, SECRET);
if (Date.now() > expiresAt) throw new Error("Token expired");
return userId;
} catch (e) {
throw new Error("Invalid token");
}
}