@cleverclouds/auth-client 0.0.0-stage → 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/AGENTS.md +379 -0
- package/README.md +450 -2
- package/dist/client.d.ts +61 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +226 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto.d.ts +12 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +66 -0
- package/dist/crypto.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +49 -0
- package/dist/errors.js.map +1 -0
- package/dist/express/index.d.ts +18 -0
- package/dist/express/index.d.ts.map +1 -0
- package/dist/express/index.js +296 -0
- package/dist/express/index.js.map +1 -0
- package/dist/express/types.d.ts +70 -0
- package/dist/express/types.d.ts.map +1 -0
- package/dist/express/types.js +3 -0
- package/dist/express/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/nextjs/index.d.ts +33 -0
- package/dist/nextjs/index.d.ts.map +1 -0
- package/dist/nextjs/index.js +178 -0
- package/dist/nextjs/index.js.map +1 -0
- package/dist/nextjs/types.d.ts +51 -0
- package/dist/nextjs/types.d.ts.map +1 -0
- package/dist/nextjs/types.js +3 -0
- package/dist/nextjs/types.js.map +1 -0
- package/dist/permissions.d.ts +25 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +62 -0
- package/dist/permissions.js.map +1 -0
- package/dist/types.d.ts +53 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +86 -4
package/dist/client.js
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CleverCloudsAuthClient = void 0;
|
|
4
|
+
const crypto_js_1 = require("./crypto.js");
|
|
5
|
+
const permissions_js_1 = require("./permissions.js");
|
|
6
|
+
const errors_js_1 = require("./errors.js");
|
|
7
|
+
class CleverCloudsAuthClient {
|
|
8
|
+
identityBaseUrl;
|
|
9
|
+
applicationSlug;
|
|
10
|
+
applicationApiKey;
|
|
11
|
+
redirectUri;
|
|
12
|
+
sessionSecret;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
if (!config.applicationSlug) {
|
|
15
|
+
throw new Error('CleverCloudsAuthClient: applicationSlug is required');
|
|
16
|
+
}
|
|
17
|
+
if (!config.applicationApiKey) {
|
|
18
|
+
throw new Error('CleverCloudsAuthClient: applicationApiKey is required');
|
|
19
|
+
}
|
|
20
|
+
if (!config.redirectUri) {
|
|
21
|
+
throw new Error('CleverCloudsAuthClient: redirectUri is required');
|
|
22
|
+
}
|
|
23
|
+
this.identityBaseUrl = (config.identityBaseUrl || 'http://localhost:3000').replace(/\/+$/, '');
|
|
24
|
+
this.applicationSlug = config.applicationSlug.toLowerCase().trim();
|
|
25
|
+
this.applicationApiKey = config.applicationApiKey.trim();
|
|
26
|
+
this.redirectUri = config.redirectUri.trim();
|
|
27
|
+
this.sessionSecret = config.sessionSecret;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generates the SSO authorization redirect URL pointing to CleverClouds Identity.
|
|
31
|
+
*/
|
|
32
|
+
getAuthorizationUrl(options = {}) {
|
|
33
|
+
const url = new URL(`${this.identityBaseUrl}/api/auth/authorize`);
|
|
34
|
+
url.searchParams.set('app', this.applicationSlug);
|
|
35
|
+
url.searchParams.set('returnTo', options.returnTo || this.redirectUri);
|
|
36
|
+
if (options.state) {
|
|
37
|
+
url.searchParams.set('state', options.state);
|
|
38
|
+
}
|
|
39
|
+
return url.toString();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Generates the direct login initiation URL pointing to CleverClouds Identity.
|
|
43
|
+
*/
|
|
44
|
+
getLoginUrl(options = {}) {
|
|
45
|
+
const url = new URL(`${this.identityBaseUrl}/login`);
|
|
46
|
+
url.searchParams.set('app', this.applicationSlug);
|
|
47
|
+
url.searchParams.set('returnTo', options.returnTo || this.redirectUri);
|
|
48
|
+
if (options.state) {
|
|
49
|
+
url.searchParams.set('state', options.state);
|
|
50
|
+
}
|
|
51
|
+
return url.toString();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Generates the Identity logout URL.
|
|
55
|
+
*/
|
|
56
|
+
getLogoutUrl(returnTo) {
|
|
57
|
+
const url = new URL(`${this.identityBaseUrl}/api/auth/logout`);
|
|
58
|
+
if (returnTo) {
|
|
59
|
+
url.searchParams.set('returnTo', returnTo);
|
|
60
|
+
}
|
|
61
|
+
return url.toString();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Exchanges an authorization ticket with detailed success/error response.
|
|
65
|
+
*/
|
|
66
|
+
async exchangeTicketDetailed(ticket) {
|
|
67
|
+
if (!ticket || typeof ticket !== 'string') {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: new errors_js_1.InvalidTicketError('No authorization ticket provided'),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Support monkey-patched exchangeTicket on instances (e.g. mock in unit tests)
|
|
74
|
+
if (this.exchangeTicket !== CleverCloudsAuthClient.prototype.exchangeTicket) {
|
|
75
|
+
try {
|
|
76
|
+
const res = await this.exchangeTicket(ticket);
|
|
77
|
+
if (res) {
|
|
78
|
+
return { success: true, data: res };
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
success: false,
|
|
82
|
+
error: new errors_js_1.InvalidTicketError('Invalid or expired ticket'),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
error: new errors_js_1.CleverCloudsAuthError(err?.message || 'Ticket exchange failed', 'AUTH_ERROR', 500),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const res = await fetch(`${this.identityBaseUrl}/api/integration/token-exchange`, {
|
|
94
|
+
method: 'POST',
|
|
95
|
+
headers: {
|
|
96
|
+
'Content-Type': 'application/json',
|
|
97
|
+
'X-Application-Key': this.applicationApiKey,
|
|
98
|
+
},
|
|
99
|
+
body: JSON.stringify({
|
|
100
|
+
ticket,
|
|
101
|
+
applicationSlug: this.applicationSlug,
|
|
102
|
+
}),
|
|
103
|
+
});
|
|
104
|
+
const json = await res.json().catch(() => null);
|
|
105
|
+
if (!res.ok || !json?.success) {
|
|
106
|
+
const code = json?.error?.code || 'AUTH_ERROR';
|
|
107
|
+
const message = json?.error?.message || 'Ticket exchange failed';
|
|
108
|
+
if (code === 'APP_ACCESS_DENIED') {
|
|
109
|
+
return { success: false, error: new errors_js_1.AppAccessDeniedError(message, json?.error) };
|
|
110
|
+
}
|
|
111
|
+
if (code === 'INVALID_TICKET') {
|
|
112
|
+
return { success: false, error: new errors_js_1.InvalidTicketError(message, json?.error) };
|
|
113
|
+
}
|
|
114
|
+
if (code === 'FORBIDDEN' || code === 'UNAUTHORIZED') {
|
|
115
|
+
return { success: false, error: new errors_js_1.InvalidCredentialsError(message, json?.error) };
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
success: false,
|
|
119
|
+
error: new errors_js_1.CleverCloudsAuthError(message, code, res.status, json?.error),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
success: true,
|
|
124
|
+
data: {
|
|
125
|
+
valid: true,
|
|
126
|
+
user: json.data.user,
|
|
127
|
+
application: json.data.application,
|
|
128
|
+
roles: json.data.roles || [],
|
|
129
|
+
permissions: json.data.permissions || [],
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
error: new errors_js_1.CleverCloudsAuthError(err?.message || 'Network communication failure with Identity server', 'NETWORK_ERROR', 500),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Exchanges a single-use authorization ticket with CleverClouds Identity for
|
|
142
|
+
* the verified user profile, assigned roles, and application-scoped permissions.
|
|
143
|
+
*/
|
|
144
|
+
async exchangeTicket(ticket) {
|
|
145
|
+
const result = await this.exchangeTicketDetailed(ticket);
|
|
146
|
+
return result.success ? result.data : null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Verifies an active session token directly against CleverClouds Identity.
|
|
150
|
+
*/
|
|
151
|
+
async verifySession(sessionToken) {
|
|
152
|
+
if (!sessionToken || typeof sessionToken !== 'string')
|
|
153
|
+
return null;
|
|
154
|
+
try {
|
|
155
|
+
const res = await fetch(`${this.identityBaseUrl}/api/integration/verify-session`, {
|
|
156
|
+
method: 'POST',
|
|
157
|
+
headers: {
|
|
158
|
+
'Content-Type': 'application/json',
|
|
159
|
+
'X-Application-Key': this.applicationApiKey,
|
|
160
|
+
},
|
|
161
|
+
body: JSON.stringify({
|
|
162
|
+
sessionToken,
|
|
163
|
+
applicationSlug: this.applicationSlug,
|
|
164
|
+
}),
|
|
165
|
+
});
|
|
166
|
+
const json = await res.json();
|
|
167
|
+
if (!res.ok || !json.success) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
valid: true,
|
|
172
|
+
user: json.data.user,
|
|
173
|
+
application: json.data.application,
|
|
174
|
+
roles: json.data.roles || [],
|
|
175
|
+
permissions: json.data.permissions || [],
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Encodes and cryptographically signs a session payload for storage in downstream cookies.
|
|
184
|
+
*/
|
|
185
|
+
signSessionCookie(result, options = {}) {
|
|
186
|
+
if (!this.sessionSecret) {
|
|
187
|
+
throw new Error('CleverCloudsAuthClient: sessionSecret is required to sign session cookies');
|
|
188
|
+
}
|
|
189
|
+
return (0, crypto_js_1.signCookie)(result, this.sessionSecret, options);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Verifies an incoming session cookie value, enforcing HMAC integrity via sessionSecret.
|
|
193
|
+
*/
|
|
194
|
+
verifySessionCookie(cookieValue) {
|
|
195
|
+
if (!cookieValue || typeof cookieValue !== 'string')
|
|
196
|
+
return null;
|
|
197
|
+
if (!this.sessionSecret) {
|
|
198
|
+
throw new Error('CleverCloudsAuthClient: sessionSecret is required to verify session cookies');
|
|
199
|
+
}
|
|
200
|
+
return (0, crypto_js_1.verifyCookie)(cookieValue, this.sessionSecret);
|
|
201
|
+
}
|
|
202
|
+
// --- Permission evaluation instance methods ---
|
|
203
|
+
hasPermission(permissions, required) {
|
|
204
|
+
return (0, permissions_js_1.hasPermission)(permissions, required);
|
|
205
|
+
}
|
|
206
|
+
hasAnyPermission(permissions, requiredList) {
|
|
207
|
+
return (0, permissions_js_1.hasAnyPermission)(permissions, requiredList);
|
|
208
|
+
}
|
|
209
|
+
hasAllPermissions(permissions, requiredList) {
|
|
210
|
+
return (0, permissions_js_1.hasAllPermissions)(permissions, requiredList);
|
|
211
|
+
}
|
|
212
|
+
hasRole(roles, roleSlug) {
|
|
213
|
+
return (0, permissions_js_1.hasRole)(roles, roleSlug);
|
|
214
|
+
}
|
|
215
|
+
hasAnyRole(roles, roleSlugs) {
|
|
216
|
+
return (0, permissions_js_1.hasAnyRole)(roles, roleSlugs);
|
|
217
|
+
}
|
|
218
|
+
// --- Permission evaluation static methods ---
|
|
219
|
+
static hasPermission = permissions_js_1.hasPermission;
|
|
220
|
+
static hasAnyPermission = permissions_js_1.hasAnyPermission;
|
|
221
|
+
static hasAllPermissions = permissions_js_1.hasAllPermissions;
|
|
222
|
+
static hasRole = permissions_js_1.hasRole;
|
|
223
|
+
static hasAnyRole = permissions_js_1.hasAnyRole;
|
|
224
|
+
}
|
|
225
|
+
exports.CleverCloudsAuthClient = CleverCloudsAuthClient;
|
|
226
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/crypto.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CookieSignOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Signs a payload with an HMAC-SHA256 signature to prevent client-side cookie tampering.
|
|
4
|
+
* Produces a URL-safe `<base64url-payload>.<base64url-hmac>` token.
|
|
5
|
+
*/
|
|
6
|
+
export declare function signCookie<T>(data: T, secret: string, options?: CookieSignOptions): string;
|
|
7
|
+
/**
|
|
8
|
+
* Verifies an HMAC-SHA256 signed cookie token using constant-time comparison.
|
|
9
|
+
* Returns the deserialized data payload if valid and unexpired; returns null on tampering.
|
|
10
|
+
*/
|
|
11
|
+
export declare function verifyCookie<T>(signedValue: string, secret: string): T | null;
|
|
12
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQpD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAkBR;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAuC7E"}
|
package/dist/crypto.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
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.signCookie = signCookie;
|
|
7
|
+
exports.verifyCookie = verifyCookie;
|
|
8
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
9
|
+
/**
|
|
10
|
+
* Signs a payload with an HMAC-SHA256 signature to prevent client-side cookie tampering.
|
|
11
|
+
* Produces a URL-safe `<base64url-payload>.<base64url-hmac>` token.
|
|
12
|
+
*/
|
|
13
|
+
function signCookie(data, secret, options = {}) {
|
|
14
|
+
if (!secret) {
|
|
15
|
+
throw new Error('A non-empty secret is required to sign session cookies');
|
|
16
|
+
}
|
|
17
|
+
const envelope = {
|
|
18
|
+
data,
|
|
19
|
+
issuedAt: Date.now(),
|
|
20
|
+
expiresAt: options.ttlSeconds ? Date.now() + options.ttlSeconds * 1000 : undefined,
|
|
21
|
+
};
|
|
22
|
+
const payloadB64 = Buffer.from(JSON.stringify(envelope)).toString('base64url');
|
|
23
|
+
const signature = node_crypto_1.default
|
|
24
|
+
.createHmac('sha256', secret)
|
|
25
|
+
.update(payloadB64)
|
|
26
|
+
.digest('base64url');
|
|
27
|
+
return `${payloadB64}.${signature}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Verifies an HMAC-SHA256 signed cookie token using constant-time comparison.
|
|
31
|
+
* Returns the deserialized data payload if valid and unexpired; returns null on tampering.
|
|
32
|
+
*/
|
|
33
|
+
function verifyCookie(signedValue, secret) {
|
|
34
|
+
if (!signedValue || typeof signedValue !== 'string' || !secret) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const parts = signedValue.split('.');
|
|
38
|
+
if (parts.length !== 2) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const [payloadB64, providedSignature] = parts;
|
|
42
|
+
// Compute expected signature
|
|
43
|
+
const expectedSignature = node_crypto_1.default
|
|
44
|
+
.createHmac('sha256', secret)
|
|
45
|
+
.update(payloadB64)
|
|
46
|
+
.digest('base64url');
|
|
47
|
+
// Constant-time comparison using SHA-256 buffer digests to prevent length-leak timing attacks
|
|
48
|
+
const expectedHash = node_crypto_1.default.createHash('sha256').update(expectedSignature).digest();
|
|
49
|
+
const providedHash = node_crypto_1.default.createHash('sha256').update(providedSignature).digest();
|
|
50
|
+
if (!node_crypto_1.default.timingSafeEqual(expectedHash, providedHash)) {
|
|
51
|
+
return null; // Signature mismatch (tampered cookie)
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const rawJson = Buffer.from(payloadB64, 'base64url').toString('utf-8');
|
|
55
|
+
const envelope = JSON.parse(rawJson);
|
|
56
|
+
// Check expiration
|
|
57
|
+
if (envelope.expiresAt && Date.now() > envelope.expiresAt) {
|
|
58
|
+
return null; // Expired cookie
|
|
59
|
+
}
|
|
60
|
+
return envelope.data;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":";;;;;AAaA,gCAsBC;AAMD,oCAuCC;AAhFD,8DAAiC;AASjC;;;GAGG;AACH,SAAgB,UAAU,CACxB,IAAO,EACP,MAAc,EACd,UAA6B,EAAE;IAE/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,QAAQ,GAAgB;QAC5B,IAAI;QACJ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;QACpB,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS;KACnF,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,qBAAM;SACrB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC5B,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,OAAO,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAI,WAAmB,EAAE,MAAc;IACjE,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC;IAE9C,6BAA6B;IAC7B,MAAM,iBAAiB,GAAG,qBAAM;SAC7B,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC5B,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,8FAA8F;IAC9F,MAAM,YAAY,GAAG,qBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,CAAC;IACpF,MAAM,YAAY,GAAG,qBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,CAAC;IAEpF,IAAI,CAAC,qBAAM,CAAC,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,CAAC,uCAAuC;IACtD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;QAEpD,mBAAmB;QACnB,IAAI,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,CAAC,iBAAiB;QAChC,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CleverClouds Identity SDK Error Types
|
|
3
|
+
*/
|
|
4
|
+
export declare class CleverCloudsAuthError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
readonly statusCode?: number;
|
|
7
|
+
readonly details?: any;
|
|
8
|
+
constructor(message: string, code?: string, statusCode?: number, details?: any);
|
|
9
|
+
}
|
|
10
|
+
export declare class AppAccessDeniedError extends CleverCloudsAuthError {
|
|
11
|
+
constructor(message?: string, details?: any);
|
|
12
|
+
}
|
|
13
|
+
export declare class InvalidTicketError extends CleverCloudsAuthError {
|
|
14
|
+
constructor(message?: string, details?: any);
|
|
15
|
+
}
|
|
16
|
+
export declare class InvalidCredentialsError extends CleverCloudsAuthError {
|
|
17
|
+
constructor(message?: string, details?: any);
|
|
18
|
+
}
|
|
19
|
+
export declare class SessionExpiredError extends CleverCloudsAuthError {
|
|
20
|
+
constructor(message?: string, details?: any);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,OAAO,CAAC,EAAE,GAAG,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAqB,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAQ7F;AAED,qBAAa,oBAAqB,SAAQ,qBAAqB;gBACjD,OAAO,GAAE,MAA2D,EAAE,OAAO,CAAC,EAAE,GAAG;CAIhG;AAED,qBAAa,kBAAmB,SAAQ,qBAAqB;gBAC/C,OAAO,GAAE,MAAiF,EAAE,OAAO,CAAC,EAAE,GAAG;CAItH;AAED,qBAAa,uBAAwB,SAAQ,qBAAqB;gBACpD,OAAO,GAAE,MAAwE,EAAE,OAAO,CAAC,EAAE,GAAG;CAI7G;AAED,qBAAa,mBAAoB,SAAQ,qBAAqB;gBAChD,OAAO,GAAE,MAAiE,EAAE,OAAO,CAAC,EAAE,GAAG;CAItG"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CleverClouds Identity SDK Error Types
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SessionExpiredError = exports.InvalidCredentialsError = exports.InvalidTicketError = exports.AppAccessDeniedError = exports.CleverCloudsAuthError = void 0;
|
|
7
|
+
class CleverCloudsAuthError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
statusCode;
|
|
10
|
+
details;
|
|
11
|
+
constructor(message, code = 'AUTH_ERROR', statusCode, details) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'CleverCloudsAuthError';
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.statusCode = statusCode;
|
|
16
|
+
this.details = details;
|
|
17
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.CleverCloudsAuthError = CleverCloudsAuthError;
|
|
21
|
+
class AppAccessDeniedError extends CleverCloudsAuthError {
|
|
22
|
+
constructor(message = 'User does not possess access to this application', details) {
|
|
23
|
+
super(message, 'APP_ACCESS_DENIED', 403, details);
|
|
24
|
+
this.name = 'AppAccessDeniedError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.AppAccessDeniedError = AppAccessDeniedError;
|
|
28
|
+
class InvalidTicketError extends CleverCloudsAuthError {
|
|
29
|
+
constructor(message = 'Authorization ticket is invalid, expired, or has already been redeemed', details) {
|
|
30
|
+
super(message, 'INVALID_TICKET', 401, details);
|
|
31
|
+
this.name = 'InvalidTicketError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.InvalidTicketError = InvalidTicketError;
|
|
35
|
+
class InvalidCredentialsError extends CleverCloudsAuthError {
|
|
36
|
+
constructor(message = 'Invalid application API key or inactive application container', details) {
|
|
37
|
+
super(message, 'INVALID_CREDENTIALS', 403, details);
|
|
38
|
+
this.name = 'InvalidCredentialsError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.InvalidCredentialsError = InvalidCredentialsError;
|
|
42
|
+
class SessionExpiredError extends CleverCloudsAuthError {
|
|
43
|
+
constructor(message = 'Session has expired or was revoked by an administrator', details) {
|
|
44
|
+
super(message, 'SESSION_EXPIRED', 401, details);
|
|
45
|
+
this.name = 'SessionExpiredError';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.SessionExpiredError = SessionExpiredError;
|
|
49
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAa,qBAAsB,SAAQ,KAAK;IAC9B,IAAI,CAAS;IACb,UAAU,CAAU;IACpB,OAAO,CAAO;IAE9B,YAAY,OAAe,EAAE,OAAe,YAAY,EAAE,UAAmB,EAAE,OAAa;QAC1F,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAbD,sDAaC;AAED,MAAa,oBAAqB,SAAQ,qBAAqB;IAC7D,YAAY,UAAkB,kDAAkD,EAAE,OAAa;QAC7F,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AALD,oDAKC;AAED,MAAa,kBAAmB,SAAQ,qBAAqB;IAC3D,YAAY,UAAkB,wEAAwE,EAAE,OAAa;QACnH,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,MAAa,uBAAwB,SAAQ,qBAAqB;IAChE,YAAY,UAAkB,+DAA+D,EAAE,OAAa;QAC1G,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AALD,0DAKC;AAED,MAAa,mBAAoB,SAAQ,qBAAqB;IAC5D,YAAY,UAAkB,wDAAwD,EAAE,OAAa;QACnG,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Request, RequestHandler } from 'express';
|
|
2
|
+
import { CleverCloudsAuthClient } from '../client.js';
|
|
3
|
+
import type { VerificationResult } from '../types.js';
|
|
4
|
+
import type { AuthMiddlewareOptions, RequireAuthOptions, RequirePermissionOptions, HandleCallbackOptions, HandleLogoutOptions } from './types.js';
|
|
5
|
+
export * from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Creates Express authentication and authorization middlewares bound to a CleverCloudsAuthClient instance.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createAuthMiddleware(client: CleverCloudsAuthClient, options?: AuthMiddlewareOptions): {
|
|
10
|
+
cookieName: string;
|
|
11
|
+
resolveSession: (req: Request) => Promise<VerificationResult | null>;
|
|
12
|
+
requireAuth: (authOptions?: RequireAuthOptions) => RequestHandler;
|
|
13
|
+
requirePermission: (permission: string | string[], permOptions?: RequirePermissionOptions) => RequestHandler;
|
|
14
|
+
requireRole: (role: string | string[]) => RequestHandler;
|
|
15
|
+
handleCallback: (callbackOptions?: HandleCallbackOptions) => RequestHandler;
|
|
16
|
+
handleLogout: (logoutOptions?: HandleLogoutOptions) => RequestHandler;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA0B,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,cAAc,YAAY,CAAC;AAqB3B;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,qBAA0B;;0BAcA,OAAO,KAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;gCAqC7C,kBAAkB,KAAQ,cAAc;oCAiC5D,MAAM,GAAG,MAAM,EAAE,gBAChB,wBAAwB,KACpC,cAAc;wBAkDU,MAAM,GAAG,MAAM,EAAE,KAAG,cAAc;uCA2CpB,qBAAqB,KAAQ,cAAc;mCA4E/C,mBAAmB,KAAQ,cAAc;EA4B/E"}
|