sbacs-session-sdk 1.0.0
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/README.md +101 -0
- package/dist/client.d.ts +23 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +78 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +48 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +118 -0
- package/dist/server.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# SBACS SDK
|
|
2
|
+
|
|
3
|
+
Session-Based Access Control System SDK for seamless website integration.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @sbacs/sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
### Backend (Express.js)
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
const { SBACSServer } = require('@sbacs/sdk');
|
|
17
|
+
|
|
18
|
+
const sbacs = new SBACSServer({
|
|
19
|
+
apiKey: 'your-api-key',
|
|
20
|
+
secretKey: 'your-secret-key'
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Add middleware
|
|
24
|
+
app.use(sbacs.captureSession());
|
|
25
|
+
app.use('/api/sbacs', sbacs.routes());
|
|
26
|
+
|
|
27
|
+
// Shared access route
|
|
28
|
+
app.get('/shared/:token', sbacs.validateSharedAccess(), (req, res) => {
|
|
29
|
+
res.redirect(`/?token=${req.params.token}`);
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Frontend (React)
|
|
34
|
+
|
|
35
|
+
```jsx
|
|
36
|
+
import { useSBACS } from '@sbacs/sdk/client';
|
|
37
|
+
|
|
38
|
+
function ShareButton() {
|
|
39
|
+
const { createShareLink } = useSBACS({ apiUrl: '/api/sbacs' });
|
|
40
|
+
|
|
41
|
+
const handleShare = async () => {
|
|
42
|
+
const link = await createShareLink({
|
|
43
|
+
duration: '2h',
|
|
44
|
+
permissions: ['read', 'write']
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
navigator.clipboard.writeText(link.shareUrl);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
return <button onClick={handleShare}>Share Access</button>;
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Features
|
|
55
|
+
|
|
56
|
+
- 🔐 **Secure Token Generation** - JWT-based temporary access
|
|
57
|
+
- ⏰ **Automatic Expiration** - Configurable session duration
|
|
58
|
+
- 🎯 **Permission Control** - Granular access permissions
|
|
59
|
+
- 🔄 **Session Capture** - Seamless user session sharing
|
|
60
|
+
- 📱 **React Hooks** - Easy frontend integration
|
|
61
|
+
- 🛡️ **Middleware Support** - Express.js middleware included
|
|
62
|
+
|
|
63
|
+
## API Reference
|
|
64
|
+
|
|
65
|
+
### SBACSServer
|
|
66
|
+
|
|
67
|
+
#### Constructor
|
|
68
|
+
```javascript
|
|
69
|
+
new SBACSServer({ apiKey, secretKey })
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### Methods
|
|
73
|
+
- `captureSession()` - Middleware to capture user sessions
|
|
74
|
+
- `validateSharedAccess()` - Middleware to validate shared tokens
|
|
75
|
+
- `routes()` - Express router with SBACS endpoints
|
|
76
|
+
|
|
77
|
+
### SBACSClient
|
|
78
|
+
|
|
79
|
+
#### Constructor
|
|
80
|
+
```javascript
|
|
81
|
+
new SBACSClient({ apiUrl })
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### Methods
|
|
85
|
+
- `createSession(options)` - Create temporary access token
|
|
86
|
+
- `validateToken(token)` - Validate access token
|
|
87
|
+
- `revokeToken(token)` - Revoke access token
|
|
88
|
+
|
|
89
|
+
### React Hook
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
const { createShareLink, validateAccess } = useSBACS({ apiUrl });
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Integration Examples
|
|
96
|
+
|
|
97
|
+
See `INTEGRATION_EXAMPLE.md` for complete integration guide with fit-with-ai.
|
|
98
|
+
|
|
99
|
+
## License
|
|
100
|
+
|
|
101
|
+
MIT
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface SBACSClientConfig {
|
|
2
|
+
apiUrl: string;
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CreateSessionOptions {
|
|
6
|
+
duration: string;
|
|
7
|
+
permissions: string[];
|
|
8
|
+
description?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class SBACSClient {
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: SBACSClientConfig);
|
|
13
|
+
createSession(options: CreateSessionOptions): Promise<any>;
|
|
14
|
+
validateToken(token: string): Promise<any>;
|
|
15
|
+
revokeToken(token: string): Promise<any>;
|
|
16
|
+
private getAuthToken;
|
|
17
|
+
}
|
|
18
|
+
export declare function useSBACS(config: SBACSClientConfig): {
|
|
19
|
+
createShareLink: (options: CreateSessionOptions) => Promise<any>;
|
|
20
|
+
validateAccess: (token: string) => Promise<any>;
|
|
21
|
+
client: SBACSClient;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB;IAK/B,aAAa,CAAC,OAAO,EAAE,oBAAoB;IAsB3C,aAAa,CAAC,KAAK,EAAE,MAAM;IAM3B,WAAW,CAAC,KAAK,EAAE,MAAM;IAU/B,OAAO,CAAC,YAAY;CAIrB;AAGD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,iBAAiB;+BAGR,oBAAoB;4BAUvB,MAAM;;EAe5C"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SBACSClient = void 0;
|
|
4
|
+
exports.useSBACS = useSBACS;
|
|
5
|
+
class SBACSClient {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
// Create share session
|
|
10
|
+
async createSession(options) {
|
|
11
|
+
const response = await fetch(`${this.config.apiUrl}/create-session`, {
|
|
12
|
+
method: 'POST',
|
|
13
|
+
headers: {
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
'Authorization': `Bearer ${this.getAuthToken()}`
|
|
16
|
+
},
|
|
17
|
+
body: JSON.stringify({
|
|
18
|
+
duration: options.duration,
|
|
19
|
+
permissions: options.permissions,
|
|
20
|
+
baseUrl: window.location.origin
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new Error('Failed to create session');
|
|
25
|
+
}
|
|
26
|
+
return await response.json();
|
|
27
|
+
}
|
|
28
|
+
// Validate token
|
|
29
|
+
async validateToken(token) {
|
|
30
|
+
const response = await fetch(`${this.config.apiUrl}/validate/${token}`);
|
|
31
|
+
return await response.json();
|
|
32
|
+
}
|
|
33
|
+
// Revoke token
|
|
34
|
+
async revokeToken(token) {
|
|
35
|
+
const response = await fetch(`${this.config.apiUrl}/revoke/${token}`, {
|
|
36
|
+
method: 'DELETE',
|
|
37
|
+
headers: {
|
|
38
|
+
'Authorization': `Bearer ${this.getAuthToken()}`
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return await response.json();
|
|
42
|
+
}
|
|
43
|
+
getAuthToken() {
|
|
44
|
+
// Get token from localStorage, cookies, or context
|
|
45
|
+
return localStorage.getItem('authToken') || '';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.SBACSClient = SBACSClient;
|
|
49
|
+
// React Hook for SBACS
|
|
50
|
+
function useSBACS(config) {
|
|
51
|
+
const client = new SBACSClient(config);
|
|
52
|
+
const createShareLink = async (options) => {
|
|
53
|
+
try {
|
|
54
|
+
const result = await client.createSession(options);
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error('Failed to create share link:', error);
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const validateAccess = async (token) => {
|
|
63
|
+
try {
|
|
64
|
+
const result = await client.validateToken(token);
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error('Failed to validate access:', error);
|
|
69
|
+
return { valid: false };
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
createShareLink,
|
|
74
|
+
validateAccess,
|
|
75
|
+
client
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAgEA,4BA4BC;AAjFD,MAAa,WAAW;IAGtB,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,uBAAuB;IACvB,KAAK,CAAC,aAAa,CAAC,OAA6B;QAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,iBAAiB,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,YAAY,EAAE,EAAE;aACjD;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;aAChC,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,aAAa,KAAK,EAAE,CAAC,CAAC;QACxE,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,eAAe;IACf,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,WAAW,KAAK,EAAE,EAAE;YACpE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,YAAY,EAAE,EAAE;aACjD;SACF,CAAC,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAEO,YAAY;QAClB,mDAAmD;QACnD,OAAO,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACjD,CAAC;CACF;AAlDD,kCAkDC;AAED,uBAAuB;AACvB,SAAgB,QAAQ,CAAC,MAAyB;IAChD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,eAAe,GAAG,KAAK,EAAE,OAA6B,EAAE,EAAE;QAC9D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,eAAe;QACf,cAAc;QACd,MAAM;KACP,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useSBACS = exports.SBACSClient = exports.SBACSServer = void 0;
|
|
4
|
+
// Server exports
|
|
5
|
+
var server_1 = require("./server");
|
|
6
|
+
Object.defineProperty(exports, "SBACSServer", { enumerable: true, get: function () { return server_1.SBACSServer; } });
|
|
7
|
+
// Client exports
|
|
8
|
+
var client_1 = require("./client");
|
|
9
|
+
Object.defineProperty(exports, "SBACSClient", { enumerable: true, get: function () { return client_1.SBACSClient; } });
|
|
10
|
+
Object.defineProperty(exports, "useSBACS", { enumerable: true, get: function () { return client_1.useSBACS; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iBAAiB;AACjB,mCAAuC;AAA9B,qGAAA,WAAW,OAAA;AAGpB,iBAAiB;AACjB,mCAAiD;AAAxC,qGAAA,WAAW,OAAA;AAAE,kGAAA,QAAQ,OAAA"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import express, { Request, Response, NextFunction } from 'express';
|
|
2
|
+
declare global {
|
|
3
|
+
namespace Express {
|
|
4
|
+
interface Request {
|
|
5
|
+
user?: {
|
|
6
|
+
id: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
email?: string;
|
|
9
|
+
};
|
|
10
|
+
sharedAccess?: {
|
|
11
|
+
userId: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
permissions: string[];
|
|
14
|
+
isSharedAccess: boolean;
|
|
15
|
+
};
|
|
16
|
+
sbacs?: {
|
|
17
|
+
createShareLink: (options: any) => any;
|
|
18
|
+
getCurrentSession: () => any;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export interface SBACSConfig {
|
|
24
|
+
apiKey: string;
|
|
25
|
+
secretKey: string;
|
|
26
|
+
sessionStore?: any;
|
|
27
|
+
}
|
|
28
|
+
export interface SessionData {
|
|
29
|
+
userId: string;
|
|
30
|
+
sessionId: string;
|
|
31
|
+
permissions: string[];
|
|
32
|
+
expiresAt: Date;
|
|
33
|
+
}
|
|
34
|
+
export declare class SBACSServer {
|
|
35
|
+
private config;
|
|
36
|
+
private sessions;
|
|
37
|
+
constructor(config: SBACSConfig);
|
|
38
|
+
captureSession(): (req: Request, res: Response, next: NextFunction) => void;
|
|
39
|
+
createShareLink(user: any, options: any): {
|
|
40
|
+
token: string;
|
|
41
|
+
shareUrl: string;
|
|
42
|
+
expiresAt: Date;
|
|
43
|
+
};
|
|
44
|
+
validateSharedAccess(): (req: Request, res: Response, next: NextFunction) => express.Response<any, Record<string, any>> | undefined;
|
|
45
|
+
routes(): import("express-serve-static-core").Router;
|
|
46
|
+
private parseDuration;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAKnE,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,IAAI,CAAC,EAAE;gBACL,EAAE,EAAE,MAAM,CAAC;gBACX,SAAS,EAAE,MAAM,CAAC;gBAClB,KAAK,CAAC,EAAE,MAAM,CAAC;aAChB,CAAC;YACF,YAAY,CAAC,EAAE;gBACb,MAAM,EAAE,MAAM,CAAC;gBACf,SAAS,EAAE,MAAM,CAAC;gBAClB,WAAW,EAAE,MAAM,EAAE,CAAC;gBACtB,cAAc,EAAE,OAAO,CAAC;aACzB,CAAC;YACF,KAAK,CAAC,EAAE;gBACN,eAAe,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,CAAC;gBACvC,iBAAiB,EAAE,MAAM,GAAG,CAAC;aAC9B,CAAC;SACH;KACF;CACF;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAuC;gBAE3C,MAAM,EAAE,WAAW;IAK/B,cAAc,KACJ,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY;IAYzD,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG;;;;;IA2BvC,oBAAoB,KACV,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY;IA8BzD,MAAM;IAqCN,OAAO,CAAC,aAAa;CActB"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SBACSServer = void 0;
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
9
|
+
class SBACSServer {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.sessions = new Map();
|
|
12
|
+
this.config = config;
|
|
13
|
+
}
|
|
14
|
+
// Middleware to capture current user session
|
|
15
|
+
captureSession() {
|
|
16
|
+
return (req, res, next) => {
|
|
17
|
+
if (req.user) {
|
|
18
|
+
req.sbacs = {
|
|
19
|
+
createShareLink: (options) => this.createShareLink(req.user, options),
|
|
20
|
+
getCurrentSession: () => req.user
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
next();
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Create temporary access token
|
|
27
|
+
createShareLink(user, options) {
|
|
28
|
+
const token = jsonwebtoken_1.default.sign({
|
|
29
|
+
userId: user.id,
|
|
30
|
+
sessionId: user.sessionId,
|
|
31
|
+
permissions: options.permissions || ['read'],
|
|
32
|
+
expiresAt: new Date(Date.now() + this.parseDuration(options.duration))
|
|
33
|
+
}, this.config.secretKey, { expiresIn: options.duration });
|
|
34
|
+
this.sessions.set(token, {
|
|
35
|
+
userId: user.id,
|
|
36
|
+
sessionId: user.sessionId,
|
|
37
|
+
permissions: options.permissions || ['read'],
|
|
38
|
+
expiresAt: new Date(Date.now() + this.parseDuration(options.duration))
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
token,
|
|
42
|
+
shareUrl: `${options.baseUrl}/shared/${token}`,
|
|
43
|
+
expiresAt: new Date(Date.now() + this.parseDuration(options.duration))
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Middleware to validate shared access
|
|
47
|
+
validateSharedAccess() {
|
|
48
|
+
return (req, res, next) => {
|
|
49
|
+
const token = req.params.token || req.query.token;
|
|
50
|
+
if (!token) {
|
|
51
|
+
return res.status(401).json({ error: 'Access token required' });
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const decoded = jsonwebtoken_1.default.verify(token, this.config.secretKey);
|
|
55
|
+
const sessionData = this.sessions.get(token);
|
|
56
|
+
if (!sessionData || sessionData.expiresAt < new Date()) {
|
|
57
|
+
return res.status(401).json({ error: 'Token expired' });
|
|
58
|
+
}
|
|
59
|
+
req.sharedAccess = {
|
|
60
|
+
userId: decoded.userId,
|
|
61
|
+
sessionId: decoded.sessionId,
|
|
62
|
+
permissions: decoded.permissions,
|
|
63
|
+
isSharedAccess: true
|
|
64
|
+
};
|
|
65
|
+
next();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return res.status(401).json({ error: 'Invalid token' });
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Express routes for SBACS
|
|
73
|
+
routes() {
|
|
74
|
+
const router = express_1.default.Router();
|
|
75
|
+
// Create share link
|
|
76
|
+
router.post('/create-session', (req, res) => {
|
|
77
|
+
if (!req.user) {
|
|
78
|
+
return res.status(401).json({ error: 'Authentication required' });
|
|
79
|
+
}
|
|
80
|
+
const shareLink = this.createShareLink(req.user, {
|
|
81
|
+
duration: req.body.duration || '1h',
|
|
82
|
+
permissions: req.body.permissions || ['read'],
|
|
83
|
+
baseUrl: req.body.baseUrl || req.get('origin')
|
|
84
|
+
});
|
|
85
|
+
res.json(shareLink);
|
|
86
|
+
});
|
|
87
|
+
// Validate token
|
|
88
|
+
router.get('/validate/:token', this.validateSharedAccess(), (req, res) => {
|
|
89
|
+
res.json({
|
|
90
|
+
valid: true,
|
|
91
|
+
userId: req.sharedAccess.userId,
|
|
92
|
+
permissions: req.sharedAccess.permissions
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
// Revoke token
|
|
96
|
+
router.delete('/revoke/:token', (req, res) => {
|
|
97
|
+
const token = req.params.token;
|
|
98
|
+
this.sessions.delete(token);
|
|
99
|
+
res.json({ success: true });
|
|
100
|
+
});
|
|
101
|
+
return router;
|
|
102
|
+
}
|
|
103
|
+
parseDuration(duration) {
|
|
104
|
+
const match = duration.match(/^(\d+)([hmd])$/);
|
|
105
|
+
if (!match)
|
|
106
|
+
return 3600000; // 1 hour default
|
|
107
|
+
const value = parseInt(match[1]);
|
|
108
|
+
const unit = match[2];
|
|
109
|
+
switch (unit) {
|
|
110
|
+
case 'h': return value * 60 * 60 * 1000;
|
|
111
|
+
case 'd': return value * 24 * 60 * 60 * 1000;
|
|
112
|
+
case 'm': return value * 60 * 1000;
|
|
113
|
+
default: return 3600000;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.SBACSServer = SBACSServer;
|
|
118
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sbacs-session-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Session-Based Access Control System SDK for website integration",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist/",
|
|
9
|
+
"client/",
|
|
10
|
+
"README.md"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"prepublish": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"session-sharing",
|
|
18
|
+
"access-control",
|
|
19
|
+
"authentication",
|
|
20
|
+
"sdk"
|
|
21
|
+
],
|
|
22
|
+
"author": "SBACS Team",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"express": "^4.18.2",
|
|
26
|
+
"jsonwebtoken": "^9.0.2",
|
|
27
|
+
"crypto-js": "^4.2.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"typescript": "^5.0.0",
|
|
31
|
+
"@types/express": "^4.17.21",
|
|
32
|
+
"@types/jsonwebtoken": "^9.0.5",
|
|
33
|
+
"@types/crypto-js": "^4.2.1"
|
|
34
|
+
}
|
|
35
|
+
}
|