@longzai-intelligence-auth/session 0.0.2 → 0.0.4
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.
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +46 -0
- package/dist/index.d.mts +46 -0
- package/dist/index.mjs +1 -0
- package/package.json +7 -2
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -4
- package/dist/session-manager.d.ts +0 -9
- package/dist/session-manager.js +0 -26
- package/dist/use-cases/login.d.ts +0 -15
- package/dist/use-cases/login.js +0 -37
- package/dist/use-cases/logout.d.ts +0 -14
- package/dist/use-cases/logout.js +0 -10
- package/dist/use-cases/refresh-session.d.ts +0 -14
- package/dist/use-cases/refresh-session.js +0 -39
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("node:crypto"),t=require("@longzai-intelligence-auth/core");function n(){function t(){let t=new Uint8Array(64);return(0,e.getRandomValues)(t),Buffer.from(t).toString(`hex`)}function n(t){let n=(0,e.createHash)(`sha256`).update(t).digest(`hex`);return Promise.resolve(n)}async function r(e,t){return await n(e)===t}function i(){return crypto.randomUUID()}return{generateRefreshToken:t,hashRefreshToken:n,verifyRefreshToken:r,generateSessionId:i}}function r(e){let{adapter:n,tokenSigner:r,sessionManager:i,defaultTenantId:a}=e;return{async execute(e,o,s,c){let l=await n.user.verifyPassword(e,o);if(!l.success||!l.user)throw new t.InvalidCredentialsError;let u=l.user;if(u.status!==`active`)throw new t.AccountDisabledError;let d=i.generateRefreshToken(),f=await i.hashRefreshToken(d),p=new Date(Date.now()+10080*60*1e3).toISOString();return await n.session.create({userId:u.id,tenantId:a,refreshTokenHash:f,deviceInfo:s,ipAddress:c,expiresAt:p}),{accessToken:await r.signAccessToken({sub:u.id,type:`access`,tenantId:a}),refreshToken:d}}}}function i(e){let{adapter:t}=e;return{async execute(e){return await t.session.revoke(e),{message:`登出成功`}}}}function a(e){let{adapter:n,tokenSigner:r,sessionManager:i}=e;return{async execute(e){let a=await i.hashRefreshToken(e),o=await n.session.findByRefreshTokenHash(a);if(!o)throw new t.SessionNotFoundError;if(new Date(o.expiresAt)<new Date)throw await n.session.revoke(o.id),new t.SessionExpiredError;let s=i.generateRefreshToken(),c=await i.hashRefreshToken(s),l=new Date(Date.now()+10080*60*1e3).toISOString();return await n.session.create({userId:o.userId,tenantId:o.tenantId,refreshTokenHash:c,deviceInfo:o.deviceInfo??void 0,ipAddress:o.ipAddress??void 0,expiresAt:l}),await n.session.revoke(o.id),{accessToken:await r.signAccessToken({sub:o.userId,type:`access`,tenantId:o.tenantId}),refreshToken:s}}}}exports.createLoginUseCase=r,exports.createLogoutUseCase=i,exports.createRefreshSessionUseCase=a,exports.createSessionManager=n;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AuthBackendPort, LoginResponse, MessageResponse, RefreshTokenResponse, TokenSigner } from "@longzai-intelligence-auth/core";
|
|
2
|
+
|
|
3
|
+
//#region src/session-manager.d.ts
|
|
4
|
+
type SessionManager = {
|
|
5
|
+
generateRefreshToken(): string;
|
|
6
|
+
hashRefreshToken(token: string): Promise<string>;
|
|
7
|
+
verifyRefreshToken(token: string, storedHash: string): Promise<boolean>;
|
|
8
|
+
generateSessionId(): string;
|
|
9
|
+
};
|
|
10
|
+
declare function createSessionManager(): SessionManager;
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/use-cases/login.d.ts
|
|
13
|
+
type CreateSessionDeps = {
|
|
14
|
+
adapter: AuthBackendPort;
|
|
15
|
+
tokenSigner: TokenSigner;
|
|
16
|
+
sessionManager: SessionManager;
|
|
17
|
+
defaultTenantId: string;
|
|
18
|
+
};
|
|
19
|
+
type LoginUseCase = {
|
|
20
|
+
execute(email: string, password: string, deviceInfo?: string, ipAddress?: string): Promise<LoginResponse>;
|
|
21
|
+
};
|
|
22
|
+
declare function createLoginUseCase(deps: CreateSessionDeps): LoginUseCase;
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/use-cases/logout.d.ts
|
|
25
|
+
type CreateSessionDeps$2 = {
|
|
26
|
+
adapter: AuthBackendPort;
|
|
27
|
+
tokenSigner: TokenSigner;
|
|
28
|
+
sessionManager: SessionManager;
|
|
29
|
+
};
|
|
30
|
+
type LogoutUseCase = {
|
|
31
|
+
execute(sessionId: string): Promise<MessageResponse>;
|
|
32
|
+
};
|
|
33
|
+
declare function createLogoutUseCase(deps: CreateSessionDeps$2): LogoutUseCase;
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/use-cases/refresh-session.d.ts
|
|
36
|
+
type CreateSessionDeps$1 = {
|
|
37
|
+
adapter: AuthBackendPort;
|
|
38
|
+
tokenSigner: TokenSigner;
|
|
39
|
+
sessionManager: SessionManager;
|
|
40
|
+
};
|
|
41
|
+
type RefreshSessionUseCase = {
|
|
42
|
+
execute(refreshToken: string): Promise<RefreshTokenResponse>;
|
|
43
|
+
};
|
|
44
|
+
declare function createRefreshSessionUseCase(deps: CreateSessionDeps$1): RefreshSessionUseCase;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { type CreateSessionDeps, type LoginUseCase, type LogoutUseCase, type RefreshSessionUseCase, type SessionManager, createLoginUseCase, createLogoutUseCase, createRefreshSessionUseCase, createSessionManager };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AuthBackendPort, LoginResponse, MessageResponse, RefreshTokenResponse, TokenSigner } from "@longzai-intelligence-auth/core";
|
|
2
|
+
|
|
3
|
+
//#region src/session-manager.d.ts
|
|
4
|
+
type SessionManager = {
|
|
5
|
+
generateRefreshToken(): string;
|
|
6
|
+
hashRefreshToken(token: string): Promise<string>;
|
|
7
|
+
verifyRefreshToken(token: string, storedHash: string): Promise<boolean>;
|
|
8
|
+
generateSessionId(): string;
|
|
9
|
+
};
|
|
10
|
+
declare function createSessionManager(): SessionManager;
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/use-cases/login.d.ts
|
|
13
|
+
type CreateSessionDeps = {
|
|
14
|
+
adapter: AuthBackendPort;
|
|
15
|
+
tokenSigner: TokenSigner;
|
|
16
|
+
sessionManager: SessionManager;
|
|
17
|
+
defaultTenantId: string;
|
|
18
|
+
};
|
|
19
|
+
type LoginUseCase = {
|
|
20
|
+
execute(email: string, password: string, deviceInfo?: string, ipAddress?: string): Promise<LoginResponse>;
|
|
21
|
+
};
|
|
22
|
+
declare function createLoginUseCase(deps: CreateSessionDeps): LoginUseCase;
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/use-cases/logout.d.ts
|
|
25
|
+
type CreateSessionDeps$2 = {
|
|
26
|
+
adapter: AuthBackendPort;
|
|
27
|
+
tokenSigner: TokenSigner;
|
|
28
|
+
sessionManager: SessionManager;
|
|
29
|
+
};
|
|
30
|
+
type LogoutUseCase = {
|
|
31
|
+
execute(sessionId: string): Promise<MessageResponse>;
|
|
32
|
+
};
|
|
33
|
+
declare function createLogoutUseCase(deps: CreateSessionDeps$2): LogoutUseCase;
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/use-cases/refresh-session.d.ts
|
|
36
|
+
type CreateSessionDeps$1 = {
|
|
37
|
+
adapter: AuthBackendPort;
|
|
38
|
+
tokenSigner: TokenSigner;
|
|
39
|
+
sessionManager: SessionManager;
|
|
40
|
+
};
|
|
41
|
+
type RefreshSessionUseCase = {
|
|
42
|
+
execute(refreshToken: string): Promise<RefreshTokenResponse>;
|
|
43
|
+
};
|
|
44
|
+
declare function createRefreshSessionUseCase(deps: CreateSessionDeps$1): RefreshSessionUseCase;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { type CreateSessionDeps, type LoginUseCase, type LogoutUseCase, type RefreshSessionUseCase, type SessionManager, createLoginUseCase, createLogoutUseCase, createRefreshSessionUseCase, createSessionManager };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createHash as e,getRandomValues as t}from"node:crypto";import{AccountDisabledError as n,InvalidCredentialsError as r,SessionExpiredError as i,SessionNotFoundError as a}from"@longzai-intelligence-auth/core";function o(){function n(){let e=new Uint8Array(64);return t(e),Buffer.from(e).toString(`hex`)}function r(t){let n=e(`sha256`).update(t).digest(`hex`);return Promise.resolve(n)}async function i(e,t){return await r(e)===t}function a(){return crypto.randomUUID()}return{generateRefreshToken:n,hashRefreshToken:r,verifyRefreshToken:i,generateSessionId:a}}function s(e){let{adapter:t,tokenSigner:i,sessionManager:a,defaultTenantId:o}=e;return{async execute(e,s,c,l){let u=await t.user.verifyPassword(e,s);if(!u.success||!u.user)throw new r;let d=u.user;if(d.status!==`active`)throw new n;let f=a.generateRefreshToken(),p=await a.hashRefreshToken(f),m=new Date(Date.now()+10080*60*1e3).toISOString();return await t.session.create({userId:d.id,tenantId:o,refreshTokenHash:p,deviceInfo:c,ipAddress:l,expiresAt:m}),{accessToken:await i.signAccessToken({sub:d.id,type:`access`,tenantId:o}),refreshToken:f}}}}function c(e){let{adapter:t}=e;return{async execute(e){return await t.session.revoke(e),{message:`登出成功`}}}}function l(e){let{adapter:t,tokenSigner:n,sessionManager:r}=e;return{async execute(e){let o=await r.hashRefreshToken(e),s=await t.session.findByRefreshTokenHash(o);if(!s)throw new a;if(new Date(s.expiresAt)<new Date)throw await t.session.revoke(s.id),new i;let c=r.generateRefreshToken(),l=await r.hashRefreshToken(c),u=new Date(Date.now()+10080*60*1e3).toISOString();return await t.session.create({userId:s.userId,tenantId:s.tenantId,refreshTokenHash:l,deviceInfo:s.deviceInfo??void 0,ipAddress:s.ipAddress??void 0,expiresAt:u}),await t.session.revoke(s.id),{accessToken:await n.signAccessToken({sub:s.userId,type:`access`,tenantId:s.tenantId}),refreshToken:c}}}}export{s as createLoginUseCase,c as createLogoutUseCase,l as createRefreshSessionUseCase,o as createSessionManager};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longzai-intelligence-auth/session",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -44,9 +44,14 @@
|
|
|
44
44
|
"test": "bun test",
|
|
45
45
|
"test:watch": "bun test --watch",
|
|
46
46
|
"test:coverage": "bun test --coverage",
|
|
47
|
+
"test:unit": "bun test src/__tests__/unit/",
|
|
48
|
+
"test:integration": "bun test src/__tests__/integration/",
|
|
47
49
|
"clean": "rm -rf dist out .cache"
|
|
48
50
|
},
|
|
49
51
|
"dependencies": {
|
|
50
|
-
"@longzai-intelligence-auth/core": "0.0.
|
|
52
|
+
"@longzai-intelligence-auth/core": "0.0.4"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/bun": "^1.3.14"
|
|
51
56
|
}
|
|
52
57
|
}
|
package/dist/index.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export type { SessionManager } from "./session-manager";
|
|
2
|
-
export { createSessionManager } from "./session-manager";
|
|
3
|
-
export type { CreateSessionDeps, LoginUseCase } from "./use-cases/login";
|
|
4
|
-
export { createLoginUseCase } from "./use-cases/login";
|
|
5
|
-
export type { LogoutUseCase } from "./use-cases/logout";
|
|
6
|
-
export { createLogoutUseCase } from "./use-cases/logout";
|
|
7
|
-
export type { RefreshSessionUseCase } from "./use-cases/refresh-session";
|
|
8
|
-
export { createRefreshSessionUseCase } from "./use-cases/refresh-session";
|
package/dist/index.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
type SessionManager = {
|
|
2
|
-
generateRefreshToken(): string;
|
|
3
|
-
hashRefreshToken(token: string): Promise<string>;
|
|
4
|
-
verifyRefreshToken(token: string, storedHash: string): Promise<boolean>;
|
|
5
|
-
generateSessionId(): string;
|
|
6
|
-
};
|
|
7
|
-
declare function createSessionManager(): SessionManager;
|
|
8
|
-
export type { SessionManager };
|
|
9
|
-
export { createSessionManager };
|
package/dist/session-manager.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { createHash, getRandomValues } from "node:crypto";
|
|
2
|
-
function createSessionManager() {
|
|
3
|
-
function generateRefreshToken() {
|
|
4
|
-
const bytes = new Uint8Array(64);
|
|
5
|
-
getRandomValues(bytes);
|
|
6
|
-
return Buffer.from(bytes).toString("hex");
|
|
7
|
-
}
|
|
8
|
-
function hashRefreshToken(token) {
|
|
9
|
-
const hash = createHash("sha256").update(token).digest("hex");
|
|
10
|
-
return Promise.resolve(hash);
|
|
11
|
-
}
|
|
12
|
-
async function verifyRefreshToken(token, storedHash) {
|
|
13
|
-
const hash = await hashRefreshToken(token);
|
|
14
|
-
return hash === storedHash;
|
|
15
|
-
}
|
|
16
|
-
function generateSessionId() {
|
|
17
|
-
return crypto.randomUUID();
|
|
18
|
-
}
|
|
19
|
-
return {
|
|
20
|
-
generateRefreshToken,
|
|
21
|
-
hashRefreshToken,
|
|
22
|
-
verifyRefreshToken,
|
|
23
|
-
generateSessionId,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
export { createSessionManager };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { LoginResponse } from "@longzai-intelligence-auth/core";
|
|
2
|
-
import type { AuthBackendPort, TokenSigner } from "@longzai-intelligence-auth/core";
|
|
3
|
-
import type { SessionManager } from "../session-manager";
|
|
4
|
-
type CreateSessionDeps = {
|
|
5
|
-
adapter: AuthBackendPort;
|
|
6
|
-
tokenSigner: TokenSigner;
|
|
7
|
-
sessionManager: SessionManager;
|
|
8
|
-
defaultTenantId: string;
|
|
9
|
-
};
|
|
10
|
-
type LoginUseCase = {
|
|
11
|
-
execute(email: string, password: string, deviceInfo?: string, ipAddress?: string): Promise<LoginResponse>;
|
|
12
|
-
};
|
|
13
|
-
declare function createLoginUseCase(deps: CreateSessionDeps): LoginUseCase;
|
|
14
|
-
export type { CreateSessionDeps, LoginUseCase };
|
|
15
|
-
export { createLoginUseCase };
|
package/dist/use-cases/login.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { InvalidCredentialsError, AccountDisabledError } from "@longzai-intelligence-auth/core";
|
|
2
|
-
function createLoginUseCase(deps) {
|
|
3
|
-
const { adapter, tokenSigner, sessionManager, defaultTenantId } = deps;
|
|
4
|
-
return {
|
|
5
|
-
async execute(email, password, deviceInfo, ipAddress) {
|
|
6
|
-
const verifyResult = await adapter.user.verifyPassword(email, password);
|
|
7
|
-
if (!verifyResult.success || !verifyResult.user) {
|
|
8
|
-
throw new InvalidCredentialsError();
|
|
9
|
-
}
|
|
10
|
-
const user = verifyResult.user;
|
|
11
|
-
if (user.status !== "active") {
|
|
12
|
-
throw new AccountDisabledError();
|
|
13
|
-
}
|
|
14
|
-
const refreshToken = sessionManager.generateRefreshToken();
|
|
15
|
-
const refreshTokenHash = await sessionManager.hashRefreshToken(refreshToken);
|
|
16
|
-
const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
17
|
-
await adapter.session.create({
|
|
18
|
-
userId: user.id,
|
|
19
|
-
tenantId: defaultTenantId,
|
|
20
|
-
refreshTokenHash,
|
|
21
|
-
deviceInfo,
|
|
22
|
-
ipAddress,
|
|
23
|
-
expiresAt,
|
|
24
|
-
});
|
|
25
|
-
const accessToken = await tokenSigner.signAccessToken({
|
|
26
|
-
sub: user.id,
|
|
27
|
-
type: "access",
|
|
28
|
-
tenantId: defaultTenantId,
|
|
29
|
-
});
|
|
30
|
-
return {
|
|
31
|
-
accessToken,
|
|
32
|
-
refreshToken,
|
|
33
|
-
};
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
export { createLoginUseCase };
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { MessageResponse } from "@longzai-intelligence-auth/core";
|
|
2
|
-
import type { AuthBackendPort, TokenSigner } from "@longzai-intelligence-auth/core";
|
|
3
|
-
import type { SessionManager } from "../session-manager";
|
|
4
|
-
type CreateSessionDeps = {
|
|
5
|
-
adapter: AuthBackendPort;
|
|
6
|
-
tokenSigner: TokenSigner;
|
|
7
|
-
sessionManager: SessionManager;
|
|
8
|
-
};
|
|
9
|
-
type LogoutUseCase = {
|
|
10
|
-
execute(sessionId: string): Promise<MessageResponse>;
|
|
11
|
-
};
|
|
12
|
-
declare function createLogoutUseCase(deps: CreateSessionDeps): LogoutUseCase;
|
|
13
|
-
export type { CreateSessionDeps, LogoutUseCase };
|
|
14
|
-
export { createLogoutUseCase };
|
package/dist/use-cases/logout.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { RefreshTokenResponse } from "@longzai-intelligence-auth/core";
|
|
2
|
-
import type { AuthBackendPort, TokenSigner } from "@longzai-intelligence-auth/core";
|
|
3
|
-
import type { SessionManager } from "../session-manager";
|
|
4
|
-
type CreateSessionDeps = {
|
|
5
|
-
adapter: AuthBackendPort;
|
|
6
|
-
tokenSigner: TokenSigner;
|
|
7
|
-
sessionManager: SessionManager;
|
|
8
|
-
};
|
|
9
|
-
type RefreshSessionUseCase = {
|
|
10
|
-
execute(refreshToken: string): Promise<RefreshTokenResponse>;
|
|
11
|
-
};
|
|
12
|
-
declare function createRefreshSessionUseCase(deps: CreateSessionDeps): RefreshSessionUseCase;
|
|
13
|
-
export type { CreateSessionDeps, RefreshSessionUseCase };
|
|
14
|
-
export { createRefreshSessionUseCase };
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { SessionNotFoundError, SessionExpiredError } from "@longzai-intelligence-auth/core";
|
|
2
|
-
function createRefreshSessionUseCase(deps) {
|
|
3
|
-
const { adapter, tokenSigner, sessionManager } = deps;
|
|
4
|
-
return {
|
|
5
|
-
async execute(refreshToken) {
|
|
6
|
-
const refreshTokenHash = await sessionManager.hashRefreshToken(refreshToken);
|
|
7
|
-
const session = await adapter.session.findByRefreshTokenHash(refreshTokenHash);
|
|
8
|
-
if (!session) {
|
|
9
|
-
throw new SessionNotFoundError();
|
|
10
|
-
}
|
|
11
|
-
if (new Date(session.expiresAt) < new Date()) {
|
|
12
|
-
await adapter.session.revoke(session.id);
|
|
13
|
-
throw new SessionExpiredError();
|
|
14
|
-
}
|
|
15
|
-
const newRefreshToken = sessionManager.generateRefreshToken();
|
|
16
|
-
const newRefreshTokenHash = await sessionManager.hashRefreshToken(newRefreshToken);
|
|
17
|
-
const newExpiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
18
|
-
await adapter.session.create({
|
|
19
|
-
userId: session.userId,
|
|
20
|
-
tenantId: session.tenantId,
|
|
21
|
-
refreshTokenHash: newRefreshTokenHash,
|
|
22
|
-
deviceInfo: session.deviceInfo ?? undefined,
|
|
23
|
-
ipAddress: session.ipAddress ?? undefined,
|
|
24
|
-
expiresAt: newExpiresAt,
|
|
25
|
-
});
|
|
26
|
-
await adapter.session.revoke(session.id);
|
|
27
|
-
const accessToken = await tokenSigner.signAccessToken({
|
|
28
|
-
sub: session.userId,
|
|
29
|
-
type: "access",
|
|
30
|
-
tenantId: session.tenantId,
|
|
31
|
-
});
|
|
32
|
-
return {
|
|
33
|
-
accessToken,
|
|
34
|
-
refreshToken: newRefreshToken,
|
|
35
|
-
};
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
export { createRefreshSessionUseCase };
|