ShrimpServer 之前一锅端 Express routes / JWT / Mongoose / 用户字段访问。
现在拆成独立部件,消费方可以单独换掉任何一块:
- src/server/types.ts: ITokenAuth, IUserAccessor, IShrimpRouterDeps
- src/server/jwtAuth.ts: createJwtTokenAuth(secret | options) 默认 JWT 适配器
- src/server/buildShrimpRouter.ts: 纯函数,不直接 import jsonwebtoken/mongoose
- src/server/ShrimpServer.ts: 装配体,protected create* factory 保留,
子类化扩展不破坏(hand-server-2 的 AdminApi extends ShrimpServer 仍能用)
- src/server/index.ts: 'shrimp-server/server' entry,额外暴露低阶 API
test/buildShrimpRouter.test.ts: 用 MemoryShrimpCrud + 假 ITokenAuth 拼出
独立 Router,跑通 /config /login /me 全流程 — 保证 buildShrimpRouter 不
偷偷耦合回 ShrimpServer。
v0.3.0
31 lines
945 B
TypeScript
31 lines
945 B
TypeScript
/**
|
|
* JWT 实现 ITokenAuth — buildShrimpRouter 的默认 token 适配器
|
|
*
|
|
* 通过工厂函数注入 secret 和 expiresIn,routes 完全不需要 import jsonwebtoken。
|
|
*/
|
|
|
|
import jsonwebtoken from "jsonwebtoken"
|
|
import { ITokenAuth } from "./types"
|
|
|
|
export interface IJwtTokenAuthOptions {
|
|
secret: string
|
|
/** 过期时间,默认 '7d' */
|
|
expiresIn?: string | number
|
|
}
|
|
|
|
export function createJwtTokenAuth(secretOrOptions: string | IJwtTokenAuthOptions): ITokenAuth {
|
|
const opts: IJwtTokenAuthOptions = typeof secretOrOptions === "string"
|
|
? { secret: secretOrOptions }
|
|
: secretOrOptions
|
|
const expiresIn = opts.expiresIn ?? "7d"
|
|
|
|
return {
|
|
sign(payload) {
|
|
return jsonwebtoken.sign(payload, opts.secret, { expiresIn } as jsonwebtoken.SignOptions)
|
|
},
|
|
verify(token) {
|
|
return jsonwebtoken.verify(token, opts.secret) as Record<string, any>
|
|
},
|
|
}
|
|
}
|