@takaro/auth 0.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.
- package/README.md +1 -0
- package/dist/config.d.ts +67 -0
- package/dist/config.js +53 -0
- package/dist/config.js.map +1 -0
- package/dist/lib/ory.d.ts +43 -0
- package/dist/lib/ory.js +240 -0
- package/dist/lib/ory.js.map +1 -0
- package/dist/lib/oryAxiosClient.d.ts +1 -0
- package/dist/lib/oryAxiosClient.js +50 -0
- package/dist/lib/oryAxiosClient.js.map +1 -0
- package/dist/lib/paginationHelpers.d.ts +2 -0
- package/dist/lib/paginationHelpers.js +38 -0
- package/dist/lib/paginationHelpers.js.map +1 -0
- package/dist/lib/permissions.d.ts +27 -0
- package/dist/lib/permissions.js +120 -0
- package/dist/lib/permissions.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.js +4 -0
- package/dist/main.js.map +1 -0
- package/package.json +25 -0
- package/src/config.ts +70 -0
- package/src/lib/__tests__/ory.integration.test.ts +26 -0
- package/src/lib/ory.ts +277 -0
- package/src/lib/oryAxiosClient.ts +68 -0
- package/src/lib/paginationHelpers.ts +46 -0
- package/src/lib/permissions.ts +125 -0
- package/src/main.ts +4 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +8 -0
- package/typedoc.json +3 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @takaro/auth
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Config, IBaseConfig } from '@takaro/config';
|
|
2
|
+
export interface IAuthConfig extends IBaseConfig {
|
|
3
|
+
kratos: {
|
|
4
|
+
publicUrl: string;
|
|
5
|
+
adminUrl: string;
|
|
6
|
+
};
|
|
7
|
+
hydra: {
|
|
8
|
+
publicUrl: string;
|
|
9
|
+
adminUrl: string;
|
|
10
|
+
adminClientId: string;
|
|
11
|
+
adminClientSecret: string;
|
|
12
|
+
};
|
|
13
|
+
takaro: {
|
|
14
|
+
url: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export declare const configSchema: {
|
|
18
|
+
kratos: {
|
|
19
|
+
publicUrl: {
|
|
20
|
+
doc: string;
|
|
21
|
+
format: StringConstructor;
|
|
22
|
+
default: string;
|
|
23
|
+
env: string;
|
|
24
|
+
};
|
|
25
|
+
adminUrl: {
|
|
26
|
+
doc: string;
|
|
27
|
+
format: StringConstructor;
|
|
28
|
+
default: string;
|
|
29
|
+
env: string;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
hydra: {
|
|
33
|
+
publicUrl: {
|
|
34
|
+
doc: string;
|
|
35
|
+
format: StringConstructor;
|
|
36
|
+
default: string;
|
|
37
|
+
env: string;
|
|
38
|
+
};
|
|
39
|
+
adminUrl: {
|
|
40
|
+
doc: string;
|
|
41
|
+
format: StringConstructor;
|
|
42
|
+
default: string;
|
|
43
|
+
env: string;
|
|
44
|
+
};
|
|
45
|
+
adminClientId: {
|
|
46
|
+
doc: string;
|
|
47
|
+
format: StringConstructor;
|
|
48
|
+
default: null;
|
|
49
|
+
env: string;
|
|
50
|
+
};
|
|
51
|
+
adminClientSecret: {
|
|
52
|
+
doc: string;
|
|
53
|
+
format: StringConstructor;
|
|
54
|
+
default: null;
|
|
55
|
+
env: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
takaro: {
|
|
59
|
+
url: {
|
|
60
|
+
doc: string;
|
|
61
|
+
format: StringConstructor;
|
|
62
|
+
default: string;
|
|
63
|
+
env: string;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
export declare const config: Config<IAuthConfig>;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Config } from '@takaro/config';
|
|
2
|
+
export const configSchema = {
|
|
3
|
+
kratos: {
|
|
4
|
+
publicUrl: {
|
|
5
|
+
doc: 'The URL of the Kratos public API',
|
|
6
|
+
format: String,
|
|
7
|
+
default: 'http://kratos:4433',
|
|
8
|
+
env: 'KRATOS_URL',
|
|
9
|
+
},
|
|
10
|
+
adminUrl: {
|
|
11
|
+
doc: 'The URL of the Kratos admin API',
|
|
12
|
+
format: String,
|
|
13
|
+
default: 'http://kratos:4434',
|
|
14
|
+
env: 'KRATOS_ADMIN_URL',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
hydra: {
|
|
18
|
+
publicUrl: {
|
|
19
|
+
doc: 'The URL of the Takaro OAuth server',
|
|
20
|
+
format: String,
|
|
21
|
+
default: 'http://hydra:4444',
|
|
22
|
+
env: 'TAKARO_OAUTH_HOST',
|
|
23
|
+
},
|
|
24
|
+
adminUrl: {
|
|
25
|
+
doc: 'The URL of the Takaro OAuth admin server',
|
|
26
|
+
format: String,
|
|
27
|
+
default: 'http://hydra:4445',
|
|
28
|
+
env: 'TAKARO_OAUTH_ADMIN_HOST',
|
|
29
|
+
},
|
|
30
|
+
adminClientId: {
|
|
31
|
+
doc: 'The client ID to use when authenticating with the Takaro server',
|
|
32
|
+
format: String,
|
|
33
|
+
default: null,
|
|
34
|
+
env: 'ADMIN_CLIENT_ID',
|
|
35
|
+
},
|
|
36
|
+
adminClientSecret: {
|
|
37
|
+
doc: 'The client secret to use when authenticating with the Takaro server',
|
|
38
|
+
format: String,
|
|
39
|
+
default: null,
|
|
40
|
+
env: 'ADMIN_CLIENT_SECRET',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
takaro: {
|
|
44
|
+
url: {
|
|
45
|
+
doc: 'The URL of the Takaro server',
|
|
46
|
+
format: String,
|
|
47
|
+
default: 'http://localhost:3000',
|
|
48
|
+
env: 'TAKARO_HOST',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
export const config = new Config([configSchema]);
|
|
53
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAe,MAAM,gBAAgB,CAAC;AAkBrD,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE;QACN,SAAS,EAAE;YACT,GAAG,EAAE,kCAAkC;YACvC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,oBAAoB;YAC7B,GAAG,EAAE,YAAY;SAClB;QACD,QAAQ,EAAE;YACR,GAAG,EAAE,iCAAiC;YACtC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,oBAAoB;YAC7B,GAAG,EAAE,kBAAkB;SACxB;KACF;IACD,KAAK,EAAE;QACL,SAAS,EAAE;YACT,GAAG,EAAE,oCAAoC;YACzC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,mBAAmB;SACzB;QACD,QAAQ,EAAE;YACR,GAAG,EAAE,0CAA0C;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,yBAAyB;SAC/B;QACD,aAAa,EAAE;YACb,GAAG,EAAE,iEAAiE;YACtE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,iBAAiB;SACvB;QACD,iBAAiB,EAAE;YACjB,GAAG,EAAE,qEAAqE;YAC1E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,qBAAqB;SAC3B;KACF;IACD,MAAM,EAAE;QACN,GAAG,EAAE;YACH,GAAG,EAAE,8BAA8B;YACnC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uBAAuB;YAChC,GAAG,EAAE,aAAa;SACnB;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAc,CAAC,YAAY,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { TakaroDTO } from '@takaro/util';
|
|
2
|
+
import { Request } from 'express';
|
|
3
|
+
export declare enum AUDIENCES {
|
|
4
|
+
TAKARO_API_ADMIN = "t:api:admin"
|
|
5
|
+
}
|
|
6
|
+
export interface ITakaroIdentity {
|
|
7
|
+
id: string;
|
|
8
|
+
email: string;
|
|
9
|
+
domainId: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class TakaroTokenDTO extends TakaroDTO<TakaroTokenDTO> {
|
|
12
|
+
active: boolean;
|
|
13
|
+
clientId: string;
|
|
14
|
+
exp: number;
|
|
15
|
+
iat: number;
|
|
16
|
+
iss: string;
|
|
17
|
+
sub: string;
|
|
18
|
+
aud: string[];
|
|
19
|
+
}
|
|
20
|
+
declare class Ory {
|
|
21
|
+
private authToken;
|
|
22
|
+
private log;
|
|
23
|
+
private adminClient;
|
|
24
|
+
private identityClient;
|
|
25
|
+
private frontendClient;
|
|
26
|
+
constructor();
|
|
27
|
+
get OAuth2URL(): string;
|
|
28
|
+
deleteIdentitiesForDomain(domainId: string): Promise<void>;
|
|
29
|
+
getIdentity(id: string): Promise<ITakaroIdentity>;
|
|
30
|
+
createIdentity(email: string, domainId: string, password?: string): Promise<ITakaroIdentity>;
|
|
31
|
+
deleteIdentity(id: string): Promise<void>;
|
|
32
|
+
getIdentityFromReq(req: Request): Promise<ITakaroIdentity>;
|
|
33
|
+
submitApiLogin(username: string, password: string): Promise<import("axios").AxiosResponse<import("@ory/client").SuccessfulNativeLogin, any>>;
|
|
34
|
+
apiLogout(req: Request): Promise<true | import("axios").AxiosResponse<void, any>>;
|
|
35
|
+
introspectToken(token: string): Promise<TakaroTokenDTO>;
|
|
36
|
+
createOIDCClient(): Promise<{
|
|
37
|
+
clientId: string;
|
|
38
|
+
clientSecret: string;
|
|
39
|
+
}>;
|
|
40
|
+
getRecoveryFlow(id: string): Promise<import("@ory/client").RecoveryLinkForIdentity>;
|
|
41
|
+
}
|
|
42
|
+
export declare const ory: Ory;
|
|
43
|
+
export {};
|
package/dist/lib/ory.js
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Configuration, FrontendApi, IdentityApi, OAuth2Api } from '@ory/client';
|
|
11
|
+
import { config } from '../config.js';
|
|
12
|
+
import { errors, logger, TakaroDTO } from '@takaro/util';
|
|
13
|
+
import { createAxiosClient } from './oryAxiosClient.js';
|
|
14
|
+
import { paginateIdentities } from './paginationHelpers.js';
|
|
15
|
+
import { IsBoolean, IsNumber, IsString } from 'class-validator';
|
|
16
|
+
var IDENTITY_SCHEMA;
|
|
17
|
+
(function (IDENTITY_SCHEMA) {
|
|
18
|
+
IDENTITY_SCHEMA["USER"] = "user_v0";
|
|
19
|
+
})(IDENTITY_SCHEMA || (IDENTITY_SCHEMA = {}));
|
|
20
|
+
export var AUDIENCES;
|
|
21
|
+
(function (AUDIENCES) {
|
|
22
|
+
// Used for various sysadmin tasks in the Takaro API
|
|
23
|
+
AUDIENCES["TAKARO_API_ADMIN"] = "t:api:admin";
|
|
24
|
+
})(AUDIENCES || (AUDIENCES = {}));
|
|
25
|
+
export class TakaroTokenDTO extends TakaroDTO {
|
|
26
|
+
}
|
|
27
|
+
__decorate([
|
|
28
|
+
IsBoolean(),
|
|
29
|
+
__metadata("design:type", Boolean)
|
|
30
|
+
], TakaroTokenDTO.prototype, "active", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
IsString(),
|
|
33
|
+
__metadata("design:type", String)
|
|
34
|
+
], TakaroTokenDTO.prototype, "clientId", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
IsNumber(),
|
|
37
|
+
__metadata("design:type", Number)
|
|
38
|
+
], TakaroTokenDTO.prototype, "exp", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
IsNumber(),
|
|
41
|
+
__metadata("design:type", Number)
|
|
42
|
+
], TakaroTokenDTO.prototype, "iat", void 0);
|
|
43
|
+
__decorate([
|
|
44
|
+
IsString(),
|
|
45
|
+
__metadata("design:type", String)
|
|
46
|
+
], TakaroTokenDTO.prototype, "iss", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
IsString(),
|
|
49
|
+
__metadata("design:type", String)
|
|
50
|
+
], TakaroTokenDTO.prototype, "sub", void 0);
|
|
51
|
+
__decorate([
|
|
52
|
+
IsString({ each: true }),
|
|
53
|
+
__metadata("design:type", Array)
|
|
54
|
+
], TakaroTokenDTO.prototype, "aud", void 0);
|
|
55
|
+
function metadataTypeguard(metadata) {
|
|
56
|
+
return typeof metadata === 'object' && metadata !== null && 'domainId' in metadata;
|
|
57
|
+
}
|
|
58
|
+
class Ory {
|
|
59
|
+
constructor() {
|
|
60
|
+
this.authToken = null;
|
|
61
|
+
this.log = logger('ory');
|
|
62
|
+
this.identityClient = new IdentityApi(new Configuration({
|
|
63
|
+
basePath: config.get('kratos.adminUrl'),
|
|
64
|
+
}), undefined, createAxiosClient(config.get('kratos.adminUrl')));
|
|
65
|
+
this.frontendClient = new FrontendApi(new Configuration({
|
|
66
|
+
basePath: config.get('kratos.publicUrl'),
|
|
67
|
+
}), undefined, createAxiosClient(config.get('kratos.publicUrl')));
|
|
68
|
+
this.adminClient = new OAuth2Api(new Configuration({
|
|
69
|
+
basePath: config.get('hydra.adminUrl'),
|
|
70
|
+
}), undefined, createAxiosClient(config.get('hydra.adminUrl')));
|
|
71
|
+
}
|
|
72
|
+
get OAuth2URL() {
|
|
73
|
+
return config.get('hydra.publicUrl');
|
|
74
|
+
}
|
|
75
|
+
async deleteIdentitiesForDomain(domainId) {
|
|
76
|
+
for await (const identities of paginateIdentities(this.identityClient)) {
|
|
77
|
+
for (const identity of identities) {
|
|
78
|
+
if (identity.metadata_public &&
|
|
79
|
+
metadataTypeguard(identity.metadata_public) &&
|
|
80
|
+
identity.metadata_public.domainId === domainId) {
|
|
81
|
+
await this.deleteIdentity(identity.id);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async getIdentity(id) {
|
|
87
|
+
const res = await this.identityClient.getIdentity({
|
|
88
|
+
id,
|
|
89
|
+
});
|
|
90
|
+
if (!res.data.metadata_public) {
|
|
91
|
+
this.log.warn('Identity has no metadata_public', {
|
|
92
|
+
identity: res.data.id,
|
|
93
|
+
});
|
|
94
|
+
throw new errors.ForbiddenError();
|
|
95
|
+
}
|
|
96
|
+
if (!metadataTypeguard(res.data.metadata_public)) {
|
|
97
|
+
this.log.warn('Identity metadata_public is not of type {domainId: string}', { identity: res.data.id });
|
|
98
|
+
throw new errors.ForbiddenError();
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
id: res.data.id,
|
|
102
|
+
email: res.data.traits.email,
|
|
103
|
+
domainId: res.data.metadata_public.domainId,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async createIdentity(email, domainId, password) {
|
|
107
|
+
const body = {
|
|
108
|
+
schema_id: IDENTITY_SCHEMA.USER,
|
|
109
|
+
traits: {
|
|
110
|
+
email,
|
|
111
|
+
},
|
|
112
|
+
metadata_public: {
|
|
113
|
+
domainId,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
if (password) {
|
|
117
|
+
body.credentials = {
|
|
118
|
+
password: {
|
|
119
|
+
config: {
|
|
120
|
+
password,
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const res = await this.identityClient.createIdentity({
|
|
126
|
+
createIdentityBody: body,
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
id: res.data.id,
|
|
130
|
+
email: res.data.traits.email,
|
|
131
|
+
domainId,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async deleteIdentity(id) {
|
|
135
|
+
await this.identityClient.deleteIdentity({
|
|
136
|
+
id,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
async getIdentityFromReq(req) {
|
|
140
|
+
const tokenFromAuthHeader = req.headers['authorization']?.replace('Bearer ', '');
|
|
141
|
+
const sessionRes = await this.frontendClient.toSession({
|
|
142
|
+
cookie: req.headers.cookie,
|
|
143
|
+
xSessionToken: tokenFromAuthHeader,
|
|
144
|
+
});
|
|
145
|
+
if (!sessionRes.data.identity.metadata_public) {
|
|
146
|
+
this.log.warn('Identity has no metadata_public', {
|
|
147
|
+
identity: sessionRes.data.identity.id,
|
|
148
|
+
});
|
|
149
|
+
throw new errors.ForbiddenError();
|
|
150
|
+
}
|
|
151
|
+
if (!metadataTypeguard(sessionRes.data.identity.metadata_public)) {
|
|
152
|
+
this.log.warn('Identity metadata_public is not of type {domainId: string}', {
|
|
153
|
+
identity: sessionRes.data.identity.id,
|
|
154
|
+
});
|
|
155
|
+
throw new errors.ForbiddenError();
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
id: sessionRes.data.identity.id,
|
|
159
|
+
email: sessionRes.data.identity.traits.email,
|
|
160
|
+
domainId: sessionRes.data.identity.metadata_public.domainId,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
async submitApiLogin(username, password) {
|
|
164
|
+
const flow = await this.frontendClient.createNativeLoginFlow({
|
|
165
|
+
refresh: true,
|
|
166
|
+
});
|
|
167
|
+
return this.frontendClient.updateLoginFlow({
|
|
168
|
+
flow: flow.data.id,
|
|
169
|
+
updateLoginFlowBody: {
|
|
170
|
+
password,
|
|
171
|
+
identifier: username,
|
|
172
|
+
method: 'password',
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
async apiLogout(req) {
|
|
177
|
+
const tokenFromAuthHeader = req.headers['authorization']?.replace('Bearer ', '');
|
|
178
|
+
if (!tokenFromAuthHeader)
|
|
179
|
+
return true;
|
|
180
|
+
return this.frontendClient.performNativeLogout({
|
|
181
|
+
performNativeLogoutBody: {
|
|
182
|
+
session_token: tokenFromAuthHeader,
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async introspectToken(token) {
|
|
187
|
+
const introspectRes = await this.adminClient.introspectOAuth2Token({
|
|
188
|
+
token,
|
|
189
|
+
});
|
|
190
|
+
const data = new TakaroTokenDTO({
|
|
191
|
+
active: introspectRes.data.active,
|
|
192
|
+
clientId: introspectRes.data.client_id,
|
|
193
|
+
aud: introspectRes.data.aud,
|
|
194
|
+
exp: introspectRes.data.exp,
|
|
195
|
+
iat: introspectRes.data.iat,
|
|
196
|
+
iss: introspectRes.data.iss,
|
|
197
|
+
sub: introspectRes.data.sub,
|
|
198
|
+
});
|
|
199
|
+
try {
|
|
200
|
+
// Check for correctness of the data
|
|
201
|
+
// DOES NOT CHECK FOR EXPIRATION
|
|
202
|
+
await data.validate();
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
this.log.warn('Introspected token has invalid shape', { error });
|
|
206
|
+
throw new errors.ForbiddenError();
|
|
207
|
+
}
|
|
208
|
+
return data;
|
|
209
|
+
}
|
|
210
|
+
// Currently, this is only used for creating the admin-auth client.
|
|
211
|
+
// ...In the future we should make this more generic and allow for
|
|
212
|
+
// creating any API client perhaps?
|
|
213
|
+
async createOIDCClient() {
|
|
214
|
+
const client = await this.adminClient.createOAuth2Client({
|
|
215
|
+
oAuth2Client: {
|
|
216
|
+
grant_types: ['client_credentials'],
|
|
217
|
+
audience: [AUDIENCES.TAKARO_API_ADMIN],
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
if (!client.data.client_id || !client.data.client_secret) {
|
|
221
|
+
this.log.error('Could not create OIDC client', { client });
|
|
222
|
+
throw new errors.InternalServerError();
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
clientId: client.data.client_id,
|
|
226
|
+
clientSecret: client.data.client_secret,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
async getRecoveryFlow(id) {
|
|
230
|
+
const recoveryRes = await this.identityClient.createRecoveryLinkForIdentity({
|
|
231
|
+
createRecoveryLinkForIdentityBody: {
|
|
232
|
+
identity_id: id,
|
|
233
|
+
expires_in: '24h',
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
return recoveryRes.data;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
export const ory = new Ory();
|
|
240
|
+
//# sourceMappingURL=ory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ory.js","sourceRoot":"","sources":["../../src/lib/ory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createAxiosClient(baseURL: string): import("axios").AxiosInstance;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { addCounterToAxios, errors, logger } from '@takaro/util';
|
|
3
|
+
const log = logger('ory:http');
|
|
4
|
+
export function createAxiosClient(baseURL) {
|
|
5
|
+
const client = axios.create({
|
|
6
|
+
baseURL,
|
|
7
|
+
headers: {
|
|
8
|
+
'Content-Type': 'application/json',
|
|
9
|
+
'User-Agent': 'Takaro-Agent',
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
addCounterToAxios(client, {
|
|
13
|
+
name: 'ory_api_requests_total',
|
|
14
|
+
help: 'Total number of requests to the Ory API',
|
|
15
|
+
});
|
|
16
|
+
client.interceptors.request.use((request) => {
|
|
17
|
+
log.silly(`➡️ ${request.method?.toUpperCase()} ${request.url}`, {
|
|
18
|
+
method: request.method,
|
|
19
|
+
url: request.url,
|
|
20
|
+
});
|
|
21
|
+
return request;
|
|
22
|
+
});
|
|
23
|
+
client.interceptors.response.use((response) => {
|
|
24
|
+
log.silly(`⬅️ ${response.request.method?.toUpperCase()} ${response.request.path} ${response.status} ${response.statusText}`, {
|
|
25
|
+
status: response.status,
|
|
26
|
+
method: response.request.method,
|
|
27
|
+
url: response.request.url,
|
|
28
|
+
});
|
|
29
|
+
return response;
|
|
30
|
+
}, (error) => {
|
|
31
|
+
let details = {};
|
|
32
|
+
if (error.response?.data) {
|
|
33
|
+
const data = error.response.data;
|
|
34
|
+
details = JSON.stringify(data.error_description);
|
|
35
|
+
}
|
|
36
|
+
log.error(`☠️ Request errored: [${error.response?.status}] ${details}`, {
|
|
37
|
+
status: error.response?.status,
|
|
38
|
+
statusText: error.response?.statusText,
|
|
39
|
+
method: error.config?.method,
|
|
40
|
+
url: error.config?.url,
|
|
41
|
+
response: error.response?.data,
|
|
42
|
+
});
|
|
43
|
+
if (error.response?.status === 409) {
|
|
44
|
+
return Promise.reject(new errors.ConflictError('User with this identifier already exists'));
|
|
45
|
+
}
|
|
46
|
+
return Promise.reject(error);
|
|
47
|
+
});
|
|
48
|
+
return client;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=oryAxiosClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oryAxiosClient.js","sourceRoot":"","sources":["../../src/lib/oryAxiosClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAE/B,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,OAAO;QACP,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,cAAc;SAC7B;KACF,CAAC,CAAC;IAEH,iBAAiB,CAAC,MAAM,EAAE;QACxB,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,yCAAyC;KAChD,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC1C,GAAG,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE;YAC9D,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE;QACX,GAAG,CAAC,KAAK,CACP,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,IACtF,QAAQ,CAAC,UACX,EAAE,EACF;YACE,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;YAC/B,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG;SAC1B,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC,EACD,CAAC,KAAiB,EAAE,EAAE;QACpB,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAA+B,CAAC;YAC5D,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACnD,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,EAAE,EAAE;YACtE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM;YAC9B,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU;YACtC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM;YAC5B,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI;SAC/B,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,0CAA0C,CAAC,CAAC,CAAC;QAC9F,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { parse, URLSearchParams } from 'url';
|
|
2
|
+
export async function* paginateIdentities(adminClient, page = undefined, perPage = 100) {
|
|
3
|
+
let nextPage = page;
|
|
4
|
+
while (true) {
|
|
5
|
+
const response = await adminClient.listIdentities({
|
|
6
|
+
page: nextPage,
|
|
7
|
+
perPage,
|
|
8
|
+
});
|
|
9
|
+
if (response.data.length === 0) {
|
|
10
|
+
// Stop the iteration if there are no more items
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
yield response.data;
|
|
14
|
+
// Parse Link header
|
|
15
|
+
const linkHeader = response.headers.link;
|
|
16
|
+
const links = linkHeader.split(',');
|
|
17
|
+
const nextLink = links.find((link) => link.includes('rel="next"'));
|
|
18
|
+
if (!nextLink) {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
// Extract the 'next' page URL
|
|
22
|
+
const match = nextLink.match(/<(.*)>/);
|
|
23
|
+
const url = match ? match[1] : undefined;
|
|
24
|
+
if (!url) {
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
const parsedUrl = parse(url);
|
|
28
|
+
const params = new URLSearchParams(parsedUrl.query || '');
|
|
29
|
+
const nextPageToken = params.get('page');
|
|
30
|
+
if (nextPageToken) {
|
|
31
|
+
nextPage = parseInt(nextPageToken, 10);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
break; // stop if there is no next page
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=paginationHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginationHelpers.js","sourceRoot":"","sources":["../../src/lib/paginationHelpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAE7C,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,kBAAkB,CAAC,WAAwB,EAAE,IAAI,GAAG,SAAS,EAAE,OAAO,GAAG,GAAG;IACjG,IAAI,QAAQ,GAAuB,IAAI,CAAC;IAExC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC;YAChD,IAAI,EAAE,QAAQ;YACd,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,gDAAgD;YAChD,MAAM;QACR,CAAC;QAED,MAAM,QAAQ,CAAC,IAAI,CAAC;QAEpB,oBAAoB;QACpB,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAE3E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM;QACR,CAAC;QAED,8BAA8B;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,aAAa,EAAE,CAAC;YAClB,QAAQ,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,gCAAgC;QACzC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare enum PERMISSIONS {
|
|
2
|
+
'ROOT' = "ROOT",
|
|
3
|
+
'MANAGE_USERS' = "MANAGE_USERS",
|
|
4
|
+
'READ_USERS' = "READ_USERS",
|
|
5
|
+
'MANAGE_ROLES' = "MANAGE_ROLES",
|
|
6
|
+
'READ_ROLES' = "READ_ROLES",
|
|
7
|
+
'MANAGE_GAMESERVERS' = "MANAGE_GAMESERVERS",
|
|
8
|
+
'READ_GAMESERVERS' = "READ_GAMESERVERS",
|
|
9
|
+
'READ_MODULES' = "READ_MODULES",
|
|
10
|
+
'MANAGE_MODULES' = "MANAGE_MODULES",
|
|
11
|
+
'READ_PLAYERS' = "READ_PLAYERS",
|
|
12
|
+
'MANAGE_PLAYERS' = "MANAGE_PLAYERS",
|
|
13
|
+
'MANAGE_SETTINGS' = "MANAGE_SETTINGS",
|
|
14
|
+
'READ_SETTINGS' = "READ_SETTINGS",
|
|
15
|
+
'READ_VARIABLES' = "READ_VARIABLES",
|
|
16
|
+
'MANAGE_VARIABLES' = "MANAGE_VARIABLES",
|
|
17
|
+
'READ_EVENTS' = "READ_EVENTS",
|
|
18
|
+
'MANAGE_EVENTS' = "MANAGE_EVENTS",
|
|
19
|
+
'READ_ITEMS' = "READ_ITEMS",
|
|
20
|
+
'MANAGE_ITEMS' = "MANAGE_ITEMS"
|
|
21
|
+
}
|
|
22
|
+
export interface IPermissionDetails {
|
|
23
|
+
permission: string;
|
|
24
|
+
friendlyName: string;
|
|
25
|
+
description: string;
|
|
26
|
+
}
|
|
27
|
+
export declare const PERMISSION_DETAILS: Record<PERMISSIONS, IPermissionDetails>;
|