Files
shrimp-server/src/server/jwtAuth.ts
T
wc24 416eb84db7 refactor(server): 拆分 ShrimpServer → buildShrimpRouter + tokenAuth + accessor
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
2026-05-23 17:10:03 +08:00

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>
},
}
}