@pangza/auth 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,144 @@
1
+ /** 角色 / 权限数组内部的校验模式 */
2
+ export type AuthCheckMode = "OR" | "AND";
3
+ /** 登录账号 ID,兼容数字主键与字符串账号 */
4
+ export type LoginId = string | number;
5
+ /**
6
+ * Token 风格(对齐 Sa-Token token-style)
7
+ * - uuid / simple-uuid / random-* / tik:随机串
8
+ * - jwt:使用 jsonwebtoken 签发
9
+ */
10
+ export type TokenStyle = "uuid" | "simple-uuid" | "random-32" | "random-64" | "random-128" | "tik" | "jwt";
11
+ /** 登录会话(对齐 Sa-Token 的 token-session) */
12
+ export interface AuthSession {
13
+ /** 当前会话 token */
14
+ token: string;
15
+ /** 登录账号 */
16
+ loginId: LoginId;
17
+ /** 登录设备标识(多端:web / app / pc 等) */
18
+ device?: string;
19
+ /** 角色列表 */
20
+ roles: string[];
21
+ /** 权限列表 */
22
+ permissions: string[];
23
+ /** 展示用用户名(写操作日志等) */
24
+ username?: string;
25
+ /** 头像 */
26
+ avatar?: string;
27
+ /** 创建时间戳(ms) */
28
+ createTime: number;
29
+ /** 过期时间戳(ms);timeout=-1 时可为 Number.MAX_SAFE_INTEGER */
30
+ expireTime: number;
31
+ /** 最近活跃时间(ms),用于 activity-timeout */
32
+ lastActiveTime: number;
33
+ }
34
+ /** Redis 封装类形态(传入 Auth 的 redis 属性) */
35
+ export type AuthRedisClient = {
36
+ setJSON(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
37
+ getJSON<T = unknown>(key: string): Promise<T | null>;
38
+ del(...keys: string[]): Promise<number>;
39
+ sAdd(key: string, ...members: string[]): Promise<number>;
40
+ sMembers(key: string): Promise<string[]>;
41
+ sRem(key: string, ...members: string[]): Promise<number>;
42
+ expire?(key: string, ttlSeconds: number): Promise<boolean>;
43
+ ttl?(key: string): Promise<number>;
44
+ };
45
+ /** 登录额外参数 */
46
+ export interface LoginOptions {
47
+ roles?: string[];
48
+ permissions?: string[];
49
+ username?: string;
50
+ avatar?: string;
51
+ /** 设备标识,多端登录区分 */
52
+ device?: string;
53
+ /** 覆盖本次会话超时(毫秒);不传用全局 timeout */
54
+ timeout?: number;
55
+ }
56
+ /** Auth 中间件配置(对齐 Sa-Token) */
57
+ export interface AuthOptions {
58
+ /**
59
+ * Token 名称(请求头 / Cookie 名),对齐 sa-token.token-name。
60
+ * 默认优先读此 header,其次 Authorization。
61
+ */
62
+ tokenName?: string;
63
+ /** Token 所在请求头;默认 Authorization(兼容旧配置) */
64
+ header?: string;
65
+ /** Authorization 前缀,默认 Bearer;设为 "" 表示无前缀 */
66
+ tokenPrefix?: string;
67
+ /**
68
+ * token 有效期(毫秒),对齐 timeout。
69
+ * 默认 2 小时;传 -1 表示永不过期。
70
+ */
71
+ timeout?: number;
72
+ /**
73
+ * 临时有效期 / 闲置超时(毫秒),对齐 activity-timeout。
74
+ * 指定时间内无操作则视为过期;-1 表示不启用(默认)。
75
+ */
76
+ activityTimeout?: number;
77
+ /**
78
+ * 是否允许同一账号并发登录,对齐 allow-concurrent-login / is-concurrent。
79
+ * true:允许多端同时在线;false:新登录挤掉旧登录。
80
+ * 默认 true。
81
+ */
82
+ allowConcurrentLogin?: boolean;
83
+ /**
84
+ * 多人登录同一账号是否共用一个 token,对齐 is-share。
85
+ * true:复用已有有效 token;false:每次登录新建 token。
86
+ * 默认 false。
87
+ */
88
+ isShare?: boolean;
89
+ /** token 风格,对齐 token-style;默认 uuid */
90
+ tokenStyle?: TokenStyle;
91
+ /** 自定义生成 token(优先级高于 tokenStyle) */
92
+ createToken?: (payload: {
93
+ loginId: LoginId;
94
+ device?: string;
95
+ }) => string | Promise<string>;
96
+ /** JWT 密钥(tokenStyle=jwt 时必填,或走默认) */
97
+ jwtSecret?: string;
98
+ /** JWT 算法,默认 HS256 */
99
+ jwtAlgorithm?: string;
100
+ /** 不注入鉴权上下文的路径(支持通配:`/api/pub/**`、`/api/pub/*`、尾部 `*`) */
101
+ ignore?: string[];
102
+ /**
103
+ * 传入封装好的 Redis 类后,会话优先走 Redis;
104
+ * 不传则使用内存存储。
105
+ * 例:Auth({ redis: Redis })
106
+ */
107
+ redis?: AuthRedisClient;
108
+ /** 是否从 Cookie 读取 token(tokenName),默认 true */
109
+ readCookie?: boolean;
110
+ /**
111
+ * 角色 / 权限数组的默认校验模式。
112
+ * OR:满足一个即可;AND:必须全部满足。默认 OR。
113
+ * 可被 @AuthCheckRole / @AuthCheckPermission 的 mode 覆盖。
114
+ */
115
+ checkMode?: AuthCheckMode;
116
+ }
117
+ /** 单个请求内的鉴权上下文(AsyncLocalStorage) */
118
+ export interface AuthContextStore {
119
+ req: import("express").Request;
120
+ /** 本次请求解析出的 token */
121
+ token: string | null;
122
+ /** 对应的有效会话;token 无效时为 null */
123
+ session: AuthSession | null;
124
+ }
125
+ /** 解析后的完整配置 */
126
+ export interface ResolvedAuthOptions {
127
+ tokenName: string;
128
+ header: string;
129
+ tokenPrefix: string;
130
+ timeout: number;
131
+ activityTimeout: number;
132
+ allowConcurrentLogin: boolean;
133
+ isShare: boolean;
134
+ tokenStyle: TokenStyle;
135
+ createToken?: AuthOptions["createToken"];
136
+ jwtSecret: string;
137
+ jwtAlgorithm: string;
138
+ ignore: string[];
139
+ redis?: AuthRedisClient;
140
+ readCookie: boolean;
141
+ /** 角色 / 权限默认校验模式,默认 OR */
142
+ checkMode: AuthCheckMode;
143
+ }
144
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,39 @@
1
1
  {
2
2
  "name": "@pangza/auth",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.1",
4
+ "description": "Auth / 登录态与权限",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "require": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./package.json": "./package.json",
14
+ "./*": {
15
+ "types": "./dist/*.d.ts",
16
+ "require": "./dist/*.js",
17
+ "default": "./dist/*.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.json",
26
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""
27
+ },
28
+ "dependencies": {
29
+ "@pangza/core": "^1.0.1",
30
+ "jsonwebtoken": "^9.0.3",
31
+ "bcryptjs": "^3.0.3"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "engines": {
37
+ "node": ">=18"
38
+ }
39
+ }