@takaro/auth 0.0.0-next.09a7ca1
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 +43 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +33 -0
- package/dist/config.js.map +1 -0
- package/dist/lib/ory.d.ts +22 -0
- package/dist/lib/ory.d.ts.map +1 -0
- package/dist/lib/ory.js +125 -0
- package/dist/lib/ory.js.map +1 -0
- package/dist/lib/oryAxiosClient.d.ts +2 -0
- package/dist/lib/oryAxiosClient.d.ts.map +1 -0
- package/dist/lib/oryAxiosClient.js +27 -0
- package/dist/lib/oryAxiosClient.js.map +1 -0
- package/dist/lib/permissions.d.ts +33 -0
- package/dist/lib/permissions.d.ts.map +1 -0
- package/dist/lib/permissions.js +150 -0
- package/dist/lib/permissions.js.map +1 -0
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +4 -0
- package/dist/main.js.map +1 -0
- package/package.json +24 -0
- package/src/config.ts +45 -0
- package/src/lib/__tests__/ory.integration.test.ts +27 -0
- package/src/lib/ory.ts +163 -0
- package/src/lib/oryAxiosClient.ts +37 -0
- package/src/lib/permissions.ts +155 -0
- package/src/main.ts +4 -0
- package/tsconfig.build.json +14 -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,43 @@
|
|
|
1
|
+
import { Config, IBaseConfig } from '@takaro/config';
|
|
2
|
+
export interface IAuthConfig extends IBaseConfig {
|
|
3
|
+
kratos: {
|
|
4
|
+
publicUrl: string;
|
|
5
|
+
adminUrl: string;
|
|
6
|
+
};
|
|
7
|
+
adminClientSecret: string;
|
|
8
|
+
takaro: {
|
|
9
|
+
url: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare const configSchema: {
|
|
13
|
+
kratos: {
|
|
14
|
+
publicUrl: {
|
|
15
|
+
doc: string;
|
|
16
|
+
format: StringConstructor;
|
|
17
|
+
default: string;
|
|
18
|
+
env: string;
|
|
19
|
+
};
|
|
20
|
+
adminUrl: {
|
|
21
|
+
doc: string;
|
|
22
|
+
format: StringConstructor;
|
|
23
|
+
default: string;
|
|
24
|
+
env: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
adminClientSecret: {
|
|
28
|
+
doc: string;
|
|
29
|
+
format: StringConstructor;
|
|
30
|
+
default: null;
|
|
31
|
+
env: string;
|
|
32
|
+
};
|
|
33
|
+
takaro: {
|
|
34
|
+
url: {
|
|
35
|
+
doc: string;
|
|
36
|
+
format: StringConstructor;
|
|
37
|
+
default: string;
|
|
38
|
+
env: string;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export declare const config: Config<IAuthConfig>;
|
|
43
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BxB,CAAC;AAEF,eAAO,MAAM,MAAM,qBAA0C,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
adminClientSecret: {
|
|
18
|
+
doc: 'The client secret to use when authenticating with the Takaro server',
|
|
19
|
+
format: String,
|
|
20
|
+
default: null,
|
|
21
|
+
env: 'ADMIN_CLIENT_SECRET',
|
|
22
|
+
},
|
|
23
|
+
takaro: {
|
|
24
|
+
url: {
|
|
25
|
+
doc: 'The URL of the Takaro server',
|
|
26
|
+
format: String,
|
|
27
|
+
default: 'http://localhost:3000',
|
|
28
|
+
env: 'TAKARO_HOST',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export const config = new Config([configSchema]);
|
|
33
|
+
//# 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;AAarD,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,iBAAiB,EAAE;QACjB,GAAG,EAAE,qEAAqE;QAC1E,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,qBAAqB;KAC3B;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,22 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
export interface ITakaroIdentity {
|
|
3
|
+
id: string;
|
|
4
|
+
email: string;
|
|
5
|
+
}
|
|
6
|
+
declare class Ory {
|
|
7
|
+
private log;
|
|
8
|
+
private identityClient;
|
|
9
|
+
private frontendClient;
|
|
10
|
+
constructor();
|
|
11
|
+
getIdentity(id: string): Promise<ITakaroIdentity>;
|
|
12
|
+
getIdentityByEmail(email: string): Promise<ITakaroIdentity | null>;
|
|
13
|
+
createIdentity(email: string, password?: string): Promise<ITakaroIdentity>;
|
|
14
|
+
deleteIdentity(id: string): Promise<void>;
|
|
15
|
+
getIdentityFromReq(req: Request): Promise<ITakaroIdentity | null>;
|
|
16
|
+
submitApiLogin(username: string, password: string): Promise<import("axios").AxiosResponse<import("@ory/client").SuccessfulNativeLogin, any>>;
|
|
17
|
+
apiLogout(req: Request): Promise<true | import("axios").AxiosResponse<void, any>>;
|
|
18
|
+
getRecoveryFlow(id: string): Promise<import("@ory/client").RecoveryLinkForIdentity>;
|
|
19
|
+
}
|
|
20
|
+
export declare const ory: Ory;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=ory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ory.d.ts","sourceRoot":"","sources":["../../src/lib/ory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAMlC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,cAAM,GAAG;IACP,OAAO,CAAC,GAAG,CAAiB;IAE5B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;;IAoB9B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAWjD,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAWlE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAsC1E,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAmBjE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAcjD,SAAS,CAAC,GAAG,EAAE,OAAO;IAYtB,eAAe,CAAC,EAAE,EAAE,MAAM;CAUjC;AAED,eAAO,MAAM,GAAG,KAAY,CAAC"}
|
package/dist/lib/ory.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Configuration, FrontendApi, IdentityApi } from '@ory/client';
|
|
2
|
+
import { config } from '../config.js';
|
|
3
|
+
import { logger } from '@takaro/util';
|
|
4
|
+
import { createAxiosClient } from './oryAxiosClient.js';
|
|
5
|
+
var IDENTITY_SCHEMA;
|
|
6
|
+
(function (IDENTITY_SCHEMA) {
|
|
7
|
+
IDENTITY_SCHEMA["USER"] = "user_v0";
|
|
8
|
+
})(IDENTITY_SCHEMA || (IDENTITY_SCHEMA = {}));
|
|
9
|
+
class Ory {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.log = logger('ory');
|
|
12
|
+
this.identityClient = new IdentityApi(new Configuration({
|
|
13
|
+
basePath: config.get('kratos.adminUrl'),
|
|
14
|
+
}), undefined, createAxiosClient(config.get('kratos.adminUrl')));
|
|
15
|
+
this.frontendClient = new FrontendApi(new Configuration({
|
|
16
|
+
basePath: config.get('kratos.publicUrl'),
|
|
17
|
+
}), undefined, createAxiosClient(config.get('kratos.publicUrl')));
|
|
18
|
+
}
|
|
19
|
+
async getIdentity(id) {
|
|
20
|
+
const res = await this.identityClient.getIdentity({
|
|
21
|
+
id,
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
id: res.data.id,
|
|
25
|
+
email: res.data.traits.email,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async getIdentityByEmail(email) {
|
|
29
|
+
const identity = await this.identityClient.listIdentities({ credentialsIdentifier: email });
|
|
30
|
+
if (!identity.data.length)
|
|
31
|
+
return null;
|
|
32
|
+
return {
|
|
33
|
+
id: identity.data[0].id,
|
|
34
|
+
email: identity.data[0].traits.email,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async createIdentity(email, password) {
|
|
38
|
+
const existing = await this.identityClient.listIdentities({ credentialsIdentifier: email });
|
|
39
|
+
if (existing.data.length) {
|
|
40
|
+
this.log.warn('Identity already exists, returning existing one.', { email });
|
|
41
|
+
return {
|
|
42
|
+
id: existing.data[0].id,
|
|
43
|
+
email: existing.data[0].traits.email,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const body = {
|
|
47
|
+
schema_id: IDENTITY_SCHEMA.USER,
|
|
48
|
+
traits: {
|
|
49
|
+
email,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
if (password) {
|
|
53
|
+
body.credentials = {
|
|
54
|
+
password: {
|
|
55
|
+
config: {
|
|
56
|
+
password,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const res = await this.identityClient.createIdentity({
|
|
62
|
+
createIdentityBody: body,
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
id: res.data.id,
|
|
66
|
+
email: res.data.traits.email,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async deleteIdentity(id) {
|
|
70
|
+
await this.identityClient.deleteIdentity({
|
|
71
|
+
id,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async getIdentityFromReq(req) {
|
|
75
|
+
const tokenFromAuthHeader = req.headers['authorization']?.replace('Bearer ', '');
|
|
76
|
+
try {
|
|
77
|
+
const sessionRes = await this.frontendClient.toSession({
|
|
78
|
+
cookie: req.headers.cookie,
|
|
79
|
+
xSessionToken: tokenFromAuthHeader,
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
id: sessionRes.data.identity.id,
|
|
83
|
+
email: sessionRes.data.identity.traits.email,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
this.log.warn('Could not get identity from request', { error });
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async submitApiLogin(username, password) {
|
|
92
|
+
const flow = await this.frontendClient.createNativeLoginFlow({
|
|
93
|
+
refresh: true,
|
|
94
|
+
});
|
|
95
|
+
return this.frontendClient.updateLoginFlow({
|
|
96
|
+
flow: flow.data.id,
|
|
97
|
+
updateLoginFlowBody: {
|
|
98
|
+
password,
|
|
99
|
+
identifier: username,
|
|
100
|
+
method: 'password',
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async apiLogout(req) {
|
|
105
|
+
const tokenFromAuthHeader = req.headers['authorization']?.replace('Bearer ', '');
|
|
106
|
+
if (!tokenFromAuthHeader)
|
|
107
|
+
return true;
|
|
108
|
+
return this.frontendClient.performNativeLogout({
|
|
109
|
+
performNativeLogoutBody: {
|
|
110
|
+
session_token: tokenFromAuthHeader,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async getRecoveryFlow(id) {
|
|
115
|
+
const recoveryRes = await this.identityClient.createRecoveryLinkForIdentity({
|
|
116
|
+
createRecoveryLinkForIdentityBody: {
|
|
117
|
+
identity_id: id,
|
|
118
|
+
expires_in: '24h',
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
return recoveryRes.data;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export const ory = new Ory();
|
|
125
|
+
//# 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
|
+
{"version":3,"file":"oryAxiosClient.d.ts","sourceRoot":"","sources":["../../src/lib/oryAxiosClient.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,iCAiChD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { addCounterToAxios, errors, logger, createAxios } from '@takaro/util';
|
|
2
|
+
export function createAxiosClient(baseURL) {
|
|
3
|
+
const log = logger('ory:http');
|
|
4
|
+
const client = createAxios({
|
|
5
|
+
baseURL,
|
|
6
|
+
headers: {
|
|
7
|
+
'Content-Type': 'application/json',
|
|
8
|
+
'User-Agent': 'Takaro-Agent',
|
|
9
|
+
},
|
|
10
|
+
}, {
|
|
11
|
+
logger: log,
|
|
12
|
+
});
|
|
13
|
+
addCounterToAxios(client, {
|
|
14
|
+
name: 'ory_api_requests_total',
|
|
15
|
+
help: 'Total number of requests to the Ory API',
|
|
16
|
+
});
|
|
17
|
+
client.interceptors.response.use((response) => {
|
|
18
|
+
return response;
|
|
19
|
+
}, (error) => {
|
|
20
|
+
if (error.response?.status === 409) {
|
|
21
|
+
return Promise.reject(new errors.ConflictError('User with this identifier already exists'));
|
|
22
|
+
}
|
|
23
|
+
return Promise.reject(error);
|
|
24
|
+
});
|
|
25
|
+
return client;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=oryAxiosClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oryAxiosClient.js","sourceRoot":"","sources":["../../src/lib/oryAxiosClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE9E,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,WAAW,CACxB;QACE,OAAO;QACP,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,cAAc;SAC7B;KACF,EACD;QACE,MAAM,EAAE,GAAG;KACZ,CACF,CAAC;IAEF,iBAAiB,CAAC,MAAM,EAAE;QACxB,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,yCAAyC;KAChD,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC,EACD,CAAC,KAAiB,EAAE,EAAE;QACpB,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;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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_MODULES' = "READ_MODULES",
|
|
9
|
+
'MANAGE_MODULES' = "MANAGE_MODULES",
|
|
10
|
+
'READ_PLAYERS' = "READ_PLAYERS",
|
|
11
|
+
'MANAGE_PLAYERS' = "MANAGE_PLAYERS",
|
|
12
|
+
'MANAGE_SETTINGS' = "MANAGE_SETTINGS",
|
|
13
|
+
'READ_SETTINGS' = "READ_SETTINGS",
|
|
14
|
+
'READ_VARIABLES' = "READ_VARIABLES",
|
|
15
|
+
'MANAGE_VARIABLES' = "MANAGE_VARIABLES",
|
|
16
|
+
'READ_EVENTS' = "READ_EVENTS",
|
|
17
|
+
'MANAGE_EVENTS' = "MANAGE_EVENTS",
|
|
18
|
+
'READ_ITEMS' = "READ_ITEMS",
|
|
19
|
+
'MANAGE_ITEMS' = "MANAGE_ITEMS",
|
|
20
|
+
'READ_ENTITIES' = "READ_ENTITIES",
|
|
21
|
+
'MANAGE_ENTITIES' = "MANAGE_ENTITIES",
|
|
22
|
+
'MANAGE_SHOP_LISTINGS' = "MANAGE_SHOP_LISTINGS",
|
|
23
|
+
'MANAGE_SHOP_ORDERS' = "MANAGE_SHOP_ORDERS",
|
|
24
|
+
'VIEW_DISCORD_INFO' = "VIEW_DISCORD_INFO",
|
|
25
|
+
'SEND_DISCORD_MESSAGE' = "SEND_DISCORD_MESSAGE"
|
|
26
|
+
}
|
|
27
|
+
export interface IPermissionDetails {
|
|
28
|
+
permission: string;
|
|
29
|
+
friendlyName: string;
|
|
30
|
+
description: string;
|
|
31
|
+
}
|
|
32
|
+
export declare const PERMISSION_DETAILS: Record<PERMISSIONS, IPermissionDetails>;
|
|
33
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,MAAM,SAAS;IACf,cAAc,iBAAiB;IAC/B,YAAY,eAAe;IAC3B,cAAc,iBAAiB;IAC/B,YAAY,eAAe;IAC3B,oBAAoB,uBAAuB;IAC3C,cAAc,iBAAiB;IAC/B,gBAAgB,mBAAmB;IACnC,cAAc,iBAAiB;IAC/B,gBAAgB,mBAAmB;IACnC,iBAAiB,oBAAoB;IACrC,eAAe,kBAAkB;IACjC,gBAAgB,mBAAmB;IACnC,kBAAkB,qBAAqB;IACvC,aAAa,gBAAgB;IAC7B,eAAe,kBAAkB;IACjC,YAAY,eAAe;IAC3B,cAAc,iBAAiB;IAC/B,eAAe,kBAAkB;IACjC,iBAAiB,oBAAoB;IACrC,sBAAsB,yBAAyB;IAC/C,oBAAoB,uBAAuB;IAC3C,mBAAmB,sBAAsB;IACzC,sBAAsB,yBAAyB;CAChD;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAyHtE,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
export var PERMISSIONS;
|
|
2
|
+
(function (PERMISSIONS) {
|
|
3
|
+
PERMISSIONS["ROOT"] = "ROOT";
|
|
4
|
+
PERMISSIONS["MANAGE_USERS"] = "MANAGE_USERS";
|
|
5
|
+
PERMISSIONS["READ_USERS"] = "READ_USERS";
|
|
6
|
+
PERMISSIONS["MANAGE_ROLES"] = "MANAGE_ROLES";
|
|
7
|
+
PERMISSIONS["READ_ROLES"] = "READ_ROLES";
|
|
8
|
+
PERMISSIONS["MANAGE_GAMESERVERS"] = "MANAGE_GAMESERVERS";
|
|
9
|
+
PERMISSIONS["READ_MODULES"] = "READ_MODULES";
|
|
10
|
+
PERMISSIONS["MANAGE_MODULES"] = "MANAGE_MODULES";
|
|
11
|
+
PERMISSIONS["READ_PLAYERS"] = "READ_PLAYERS";
|
|
12
|
+
PERMISSIONS["MANAGE_PLAYERS"] = "MANAGE_PLAYERS";
|
|
13
|
+
PERMISSIONS["MANAGE_SETTINGS"] = "MANAGE_SETTINGS";
|
|
14
|
+
PERMISSIONS["READ_SETTINGS"] = "READ_SETTINGS";
|
|
15
|
+
PERMISSIONS["READ_VARIABLES"] = "READ_VARIABLES";
|
|
16
|
+
PERMISSIONS["MANAGE_VARIABLES"] = "MANAGE_VARIABLES";
|
|
17
|
+
PERMISSIONS["READ_EVENTS"] = "READ_EVENTS";
|
|
18
|
+
PERMISSIONS["MANAGE_EVENTS"] = "MANAGE_EVENTS";
|
|
19
|
+
PERMISSIONS["READ_ITEMS"] = "READ_ITEMS";
|
|
20
|
+
PERMISSIONS["MANAGE_ITEMS"] = "MANAGE_ITEMS";
|
|
21
|
+
PERMISSIONS["READ_ENTITIES"] = "READ_ENTITIES";
|
|
22
|
+
PERMISSIONS["MANAGE_ENTITIES"] = "MANAGE_ENTITIES";
|
|
23
|
+
PERMISSIONS["MANAGE_SHOP_LISTINGS"] = "MANAGE_SHOP_LISTINGS";
|
|
24
|
+
PERMISSIONS["MANAGE_SHOP_ORDERS"] = "MANAGE_SHOP_ORDERS";
|
|
25
|
+
PERMISSIONS["VIEW_DISCORD_INFO"] = "VIEW_DISCORD_INFO";
|
|
26
|
+
PERMISSIONS["SEND_DISCORD_MESSAGE"] = "SEND_DISCORD_MESSAGE";
|
|
27
|
+
})(PERMISSIONS || (PERMISSIONS = {}));
|
|
28
|
+
export const PERMISSION_DETAILS = {
|
|
29
|
+
[PERMISSIONS.ROOT]: {
|
|
30
|
+
permission: PERMISSIONS.ROOT,
|
|
31
|
+
friendlyName: 'Root Access',
|
|
32
|
+
description: 'Full access to all systems and resources',
|
|
33
|
+
},
|
|
34
|
+
[PERMISSIONS.MANAGE_USERS]: {
|
|
35
|
+
permission: PERMISSIONS.MANAGE_USERS,
|
|
36
|
+
friendlyName: 'Manage Users',
|
|
37
|
+
description: 'Can create, update, and delete users',
|
|
38
|
+
},
|
|
39
|
+
[PERMISSIONS.READ_USERS]: {
|
|
40
|
+
permission: PERMISSIONS.READ_USERS,
|
|
41
|
+
friendlyName: 'Read Users',
|
|
42
|
+
description: 'Can view user details',
|
|
43
|
+
},
|
|
44
|
+
[PERMISSIONS.MANAGE_ROLES]: {
|
|
45
|
+
permission: PERMISSIONS.MANAGE_ROLES,
|
|
46
|
+
friendlyName: 'Manage Roles',
|
|
47
|
+
description: 'Can create, update, and delete roles',
|
|
48
|
+
},
|
|
49
|
+
[PERMISSIONS.READ_ROLES]: {
|
|
50
|
+
permission: PERMISSIONS.READ_ROLES,
|
|
51
|
+
friendlyName: 'Read Roles',
|
|
52
|
+
description: 'Can view role details',
|
|
53
|
+
},
|
|
54
|
+
[PERMISSIONS.MANAGE_GAMESERVERS]: {
|
|
55
|
+
permission: PERMISSIONS.MANAGE_GAMESERVERS,
|
|
56
|
+
friendlyName: 'Manage Game Servers',
|
|
57
|
+
description: 'Can create, update, and delete game servers',
|
|
58
|
+
},
|
|
59
|
+
[PERMISSIONS.READ_MODULES]: {
|
|
60
|
+
permission: PERMISSIONS.READ_MODULES,
|
|
61
|
+
friendlyName: 'Read Modules',
|
|
62
|
+
description: 'Can view module details',
|
|
63
|
+
},
|
|
64
|
+
[PERMISSIONS.MANAGE_MODULES]: {
|
|
65
|
+
permission: PERMISSIONS.MANAGE_MODULES,
|
|
66
|
+
friendlyName: 'Manage Modules',
|
|
67
|
+
description: 'Can create, update, and delete modules',
|
|
68
|
+
},
|
|
69
|
+
[PERMISSIONS.READ_PLAYERS]: {
|
|
70
|
+
permission: PERMISSIONS.READ_PLAYERS,
|
|
71
|
+
friendlyName: 'Read Players',
|
|
72
|
+
description: 'Can view player details',
|
|
73
|
+
},
|
|
74
|
+
[PERMISSIONS.MANAGE_PLAYERS]: {
|
|
75
|
+
permission: PERMISSIONS.MANAGE_PLAYERS,
|
|
76
|
+
friendlyName: 'Manage Players',
|
|
77
|
+
description: 'Can create, update, and delete players',
|
|
78
|
+
},
|
|
79
|
+
[PERMISSIONS.MANAGE_SETTINGS]: {
|
|
80
|
+
permission: PERMISSIONS.MANAGE_SETTINGS,
|
|
81
|
+
friendlyName: 'Manage Settings',
|
|
82
|
+
description: 'Can modify settings',
|
|
83
|
+
},
|
|
84
|
+
[PERMISSIONS.READ_SETTINGS]: {
|
|
85
|
+
permission: PERMISSIONS.READ_SETTINGS,
|
|
86
|
+
friendlyName: 'Read Settings',
|
|
87
|
+
description: 'Can view settings',
|
|
88
|
+
},
|
|
89
|
+
[PERMISSIONS.READ_VARIABLES]: {
|
|
90
|
+
permission: PERMISSIONS.READ_VARIABLES,
|
|
91
|
+
friendlyName: 'Read Variables',
|
|
92
|
+
description: 'Can view variables',
|
|
93
|
+
},
|
|
94
|
+
[PERMISSIONS.MANAGE_VARIABLES]: {
|
|
95
|
+
permission: PERMISSIONS.MANAGE_VARIABLES,
|
|
96
|
+
friendlyName: 'Manage Variables',
|
|
97
|
+
description: 'Can create, update, and delete variables',
|
|
98
|
+
},
|
|
99
|
+
[PERMISSIONS.READ_EVENTS]: {
|
|
100
|
+
permission: PERMISSIONS.READ_EVENTS,
|
|
101
|
+
friendlyName: 'Read Events',
|
|
102
|
+
description: 'Can view event details',
|
|
103
|
+
},
|
|
104
|
+
[PERMISSIONS.MANAGE_EVENTS]: {
|
|
105
|
+
permission: PERMISSIONS.MANAGE_EVENTS,
|
|
106
|
+
friendlyName: 'Manage Events',
|
|
107
|
+
description: 'Can create, update, and delete events',
|
|
108
|
+
},
|
|
109
|
+
[PERMISSIONS.READ_ITEMS]: {
|
|
110
|
+
permission: PERMISSIONS.READ_ITEMS,
|
|
111
|
+
friendlyName: 'Read Items',
|
|
112
|
+
description: 'Can view item details',
|
|
113
|
+
},
|
|
114
|
+
[PERMISSIONS.MANAGE_ITEMS]: {
|
|
115
|
+
permission: PERMISSIONS.MANAGE_ITEMS,
|
|
116
|
+
friendlyName: 'Manage Items',
|
|
117
|
+
description: 'Can create, update, and delete items',
|
|
118
|
+
},
|
|
119
|
+
[PERMISSIONS.READ_ENTITIES]: {
|
|
120
|
+
permission: PERMISSIONS.READ_ENTITIES,
|
|
121
|
+
friendlyName: 'Read Entities',
|
|
122
|
+
description: 'Can view entity details',
|
|
123
|
+
},
|
|
124
|
+
[PERMISSIONS.MANAGE_ENTITIES]: {
|
|
125
|
+
permission: PERMISSIONS.MANAGE_ENTITIES,
|
|
126
|
+
friendlyName: 'Manage Entities',
|
|
127
|
+
description: 'Can create, update, and delete entities',
|
|
128
|
+
},
|
|
129
|
+
[PERMISSIONS.MANAGE_SHOP_LISTINGS]: {
|
|
130
|
+
permission: PERMISSIONS.MANAGE_SHOP_LISTINGS,
|
|
131
|
+
friendlyName: 'Manage Shop Listings',
|
|
132
|
+
description: 'Can create, update, and delete shop listings',
|
|
133
|
+
},
|
|
134
|
+
[PERMISSIONS.MANAGE_SHOP_ORDERS]: {
|
|
135
|
+
permission: PERMISSIONS.MANAGE_SHOP_ORDERS,
|
|
136
|
+
friendlyName: 'Manage Shop Orders',
|
|
137
|
+
description: 'Can view orders not belonging to the themself and perform administrative actions on them',
|
|
138
|
+
},
|
|
139
|
+
[PERMISSIONS.VIEW_DISCORD_INFO]: {
|
|
140
|
+
permission: PERMISSIONS.VIEW_DISCORD_INFO,
|
|
141
|
+
friendlyName: 'View Discord Info',
|
|
142
|
+
description: 'Can view Discord guild information including channels and roles',
|
|
143
|
+
},
|
|
144
|
+
[PERMISSIONS.SEND_DISCORD_MESSAGE]: {
|
|
145
|
+
permission: PERMISSIONS.SEND_DISCORD_MESSAGE,
|
|
146
|
+
friendlyName: 'Send Discord Messages',
|
|
147
|
+
description: 'Can send messages to Discord channels',
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
package/dist/main.js
ADDED
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,IAAI,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@takaro/auth",
|
|
3
|
+
"description": "An opinionated auth handler",
|
|
4
|
+
"version": "0.0.0-next.09a7ca1",
|
|
5
|
+
"author": "",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@ory/client": "1.14.5",
|
|
8
|
+
"axios": "1.7.7",
|
|
9
|
+
"express": "4.21.2"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [],
|
|
12
|
+
"license": "ISC",
|
|
13
|
+
"main": "dist/main.js",
|
|
14
|
+
"peerDependencies": {
|
|
15
|
+
"@takaro/config": "*",
|
|
16
|
+
"@takaro/util": "*"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -p ./tsconfig.build.json",
|
|
20
|
+
"start:dev": ":"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"types": "dist/main.d.ts"
|
|
24
|
+
}
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Config, IBaseConfig } from '@takaro/config';
|
|
2
|
+
|
|
3
|
+
export interface IAuthConfig extends IBaseConfig {
|
|
4
|
+
kratos: {
|
|
5
|
+
publicUrl: string;
|
|
6
|
+
adminUrl: string;
|
|
7
|
+
};
|
|
8
|
+
adminClientSecret: string;
|
|
9
|
+
takaro: {
|
|
10
|
+
url: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const configSchema = {
|
|
15
|
+
kratos: {
|
|
16
|
+
publicUrl: {
|
|
17
|
+
doc: 'The URL of the Kratos public API',
|
|
18
|
+
format: String,
|
|
19
|
+
default: 'http://kratos:4433',
|
|
20
|
+
env: 'KRATOS_URL',
|
|
21
|
+
},
|
|
22
|
+
adminUrl: {
|
|
23
|
+
doc: 'The URL of the Kratos admin API',
|
|
24
|
+
format: String,
|
|
25
|
+
default: 'http://kratos:4434',
|
|
26
|
+
env: 'KRATOS_ADMIN_URL',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
adminClientSecret: {
|
|
30
|
+
doc: 'The client secret to use when authenticating with the Takaro server',
|
|
31
|
+
format: String,
|
|
32
|
+
default: null,
|
|
33
|
+
env: 'ADMIN_CLIENT_SECRET',
|
|
34
|
+
},
|
|
35
|
+
takaro: {
|
|
36
|
+
url: {
|
|
37
|
+
doc: 'The URL of the Takaro server',
|
|
38
|
+
format: String,
|
|
39
|
+
default: 'http://localhost:3000',
|
|
40
|
+
env: 'TAKARO_HOST',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const config = new Config<IAuthConfig>([configSchema]);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ory } from '../ory.js';
|
|
2
|
+
import { faker } from '@faker-js/faker';
|
|
3
|
+
import { expect } from '@takaro/test';
|
|
4
|
+
import { describe, it } from 'node:test';
|
|
5
|
+
|
|
6
|
+
describe('Ory', () => {
|
|
7
|
+
it('Create and delete identities', async () => {
|
|
8
|
+
// First, create a bunch of identities
|
|
9
|
+
const totalIdentities = 150;
|
|
10
|
+
const identities = await Promise.all(
|
|
11
|
+
Array.from({ length: totalIdentities }).map(() => ory.createIdentity(faker.internet.email(), 'password')),
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
// Fetch the first one by ID
|
|
15
|
+
|
|
16
|
+
const firstIdentity = await ory.getIdentity(identities[0].id);
|
|
17
|
+
expect(firstIdentity.email).to.be.eq(identities[0].email);
|
|
18
|
+
|
|
19
|
+
// Delete them all
|
|
20
|
+
await Promise.all(identities.map((i) => ory.deleteIdentity(i.id)));
|
|
21
|
+
|
|
22
|
+
// Make sure they're gone
|
|
23
|
+
await expect(ory.getIdentity(identities[0].id)).to.eventually.be.rejectedWith(
|
|
24
|
+
'Request failed with status 404 Not Found',
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
});
|
package/src/lib/ory.ts
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { Configuration, CreateIdentityBody, FrontendApi, IdentityApi } from '@ory/client';
|
|
2
|
+
import { config } from '../config.js';
|
|
3
|
+
import { logger } from '@takaro/util';
|
|
4
|
+
import { createAxiosClient } from './oryAxiosClient.js';
|
|
5
|
+
import { Request } from 'express';
|
|
6
|
+
|
|
7
|
+
enum IDENTITY_SCHEMA {
|
|
8
|
+
USER = 'user_v0',
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface ITakaroIdentity {
|
|
12
|
+
id: string;
|
|
13
|
+
email: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
class Ory {
|
|
17
|
+
private log = logger('ory');
|
|
18
|
+
|
|
19
|
+
private identityClient: IdentityApi;
|
|
20
|
+
private frontendClient: FrontendApi;
|
|
21
|
+
|
|
22
|
+
constructor() {
|
|
23
|
+
this.identityClient = new IdentityApi(
|
|
24
|
+
new Configuration({
|
|
25
|
+
basePath: config.get('kratos.adminUrl'),
|
|
26
|
+
}),
|
|
27
|
+
undefined,
|
|
28
|
+
createAxiosClient(config.get('kratos.adminUrl')),
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
this.frontendClient = new FrontendApi(
|
|
32
|
+
new Configuration({
|
|
33
|
+
basePath: config.get('kratos.publicUrl'),
|
|
34
|
+
}),
|
|
35
|
+
undefined,
|
|
36
|
+
createAxiosClient(config.get('kratos.publicUrl')),
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async getIdentity(id: string): Promise<ITakaroIdentity> {
|
|
41
|
+
const res = await this.identityClient.getIdentity({
|
|
42
|
+
id,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
id: res.data.id,
|
|
47
|
+
email: res.data.traits.email,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async getIdentityByEmail(email: string): Promise<ITakaroIdentity | null> {
|
|
52
|
+
const identity = await this.identityClient.listIdentities({ credentialsIdentifier: email });
|
|
53
|
+
|
|
54
|
+
if (!identity.data.length) return null;
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
id: identity.data[0].id,
|
|
58
|
+
email: identity.data[0].traits.email,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async createIdentity(email: string, password?: string): Promise<ITakaroIdentity> {
|
|
63
|
+
const existing = await this.identityClient.listIdentities({ credentialsIdentifier: email });
|
|
64
|
+
|
|
65
|
+
if (existing.data.length) {
|
|
66
|
+
this.log.warn('Identity already exists, returning existing one.', { email });
|
|
67
|
+
return {
|
|
68
|
+
id: existing.data[0].id,
|
|
69
|
+
email: existing.data[0].traits.email,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const body: CreateIdentityBody = {
|
|
74
|
+
schema_id: IDENTITY_SCHEMA.USER,
|
|
75
|
+
traits: {
|
|
76
|
+
email,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
if (password) {
|
|
81
|
+
body.credentials = {
|
|
82
|
+
password: {
|
|
83
|
+
config: {
|
|
84
|
+
password,
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const res = await this.identityClient.createIdentity({
|
|
91
|
+
createIdentityBody: body,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
id: res.data.id,
|
|
96
|
+
email: res.data.traits.email,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async deleteIdentity(id: string): Promise<void> {
|
|
101
|
+
await this.identityClient.deleteIdentity({
|
|
102
|
+
id,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async getIdentityFromReq(req: Request): Promise<ITakaroIdentity | null> {
|
|
107
|
+
const tokenFromAuthHeader = req.headers['authorization']?.replace('Bearer ', '');
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
const sessionRes = await this.frontendClient.toSession({
|
|
111
|
+
cookie: req.headers.cookie,
|
|
112
|
+
xSessionToken: tokenFromAuthHeader,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
id: sessionRes.data.identity!.id,
|
|
117
|
+
email: sessionRes.data.identity!.traits.email,
|
|
118
|
+
};
|
|
119
|
+
} catch (error) {
|
|
120
|
+
this.log.warn('Could not get identity from request', { error });
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async submitApiLogin(username: string, password: string) {
|
|
126
|
+
const flow = await this.frontendClient.createNativeLoginFlow({
|
|
127
|
+
refresh: true,
|
|
128
|
+
});
|
|
129
|
+
return this.frontendClient.updateLoginFlow({
|
|
130
|
+
flow: flow.data.id,
|
|
131
|
+
updateLoginFlowBody: {
|
|
132
|
+
password,
|
|
133
|
+
identifier: username,
|
|
134
|
+
method: 'password',
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async apiLogout(req: Request) {
|
|
140
|
+
const tokenFromAuthHeader = req.headers['authorization']?.replace('Bearer ', '');
|
|
141
|
+
|
|
142
|
+
if (!tokenFromAuthHeader) return true;
|
|
143
|
+
|
|
144
|
+
return this.frontendClient.performNativeLogout({
|
|
145
|
+
performNativeLogoutBody: {
|
|
146
|
+
session_token: tokenFromAuthHeader,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async getRecoveryFlow(id: string) {
|
|
152
|
+
const recoveryRes = await this.identityClient.createRecoveryLinkForIdentity({
|
|
153
|
+
createRecoveryLinkForIdentityBody: {
|
|
154
|
+
identity_id: id,
|
|
155
|
+
expires_in: '24h',
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
return recoveryRes.data;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export const ory = new Ory();
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { AxiosError } from 'axios';
|
|
2
|
+
import { addCounterToAxios, errors, logger, createAxios } from '@takaro/util';
|
|
3
|
+
|
|
4
|
+
export function createAxiosClient(baseURL: string) {
|
|
5
|
+
const log = logger('ory:http');
|
|
6
|
+
const client = createAxios(
|
|
7
|
+
{
|
|
8
|
+
baseURL,
|
|
9
|
+
headers: {
|
|
10
|
+
'Content-Type': 'application/json',
|
|
11
|
+
'User-Agent': 'Takaro-Agent',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
logger: log,
|
|
16
|
+
},
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
addCounterToAxios(client, {
|
|
20
|
+
name: 'ory_api_requests_total',
|
|
21
|
+
help: 'Total number of requests to the Ory API',
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
client.interceptors.response.use(
|
|
25
|
+
(response) => {
|
|
26
|
+
return response;
|
|
27
|
+
},
|
|
28
|
+
(error: AxiosError) => {
|
|
29
|
+
if (error.response?.status === 409) {
|
|
30
|
+
return Promise.reject(new errors.ConflictError('User with this identifier already exists'));
|
|
31
|
+
}
|
|
32
|
+
return Promise.reject(error);
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
return client;
|
|
37
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
export 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_MODULES' = 'READ_MODULES',
|
|
9
|
+
'MANAGE_MODULES' = 'MANAGE_MODULES',
|
|
10
|
+
'READ_PLAYERS' = 'READ_PLAYERS',
|
|
11
|
+
'MANAGE_PLAYERS' = 'MANAGE_PLAYERS',
|
|
12
|
+
'MANAGE_SETTINGS' = 'MANAGE_SETTINGS',
|
|
13
|
+
'READ_SETTINGS' = 'READ_SETTINGS',
|
|
14
|
+
'READ_VARIABLES' = 'READ_VARIABLES',
|
|
15
|
+
'MANAGE_VARIABLES' = 'MANAGE_VARIABLES',
|
|
16
|
+
'READ_EVENTS' = 'READ_EVENTS',
|
|
17
|
+
'MANAGE_EVENTS' = 'MANAGE_EVENTS',
|
|
18
|
+
'READ_ITEMS' = 'READ_ITEMS',
|
|
19
|
+
'MANAGE_ITEMS' = 'MANAGE_ITEMS',
|
|
20
|
+
'READ_ENTITIES' = 'READ_ENTITIES',
|
|
21
|
+
'MANAGE_ENTITIES' = 'MANAGE_ENTITIES',
|
|
22
|
+
'MANAGE_SHOP_LISTINGS' = 'MANAGE_SHOP_LISTINGS',
|
|
23
|
+
'MANAGE_SHOP_ORDERS' = 'MANAGE_SHOP_ORDERS',
|
|
24
|
+
'VIEW_DISCORD_INFO' = 'VIEW_DISCORD_INFO',
|
|
25
|
+
'SEND_DISCORD_MESSAGE' = 'SEND_DISCORD_MESSAGE',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface IPermissionDetails {
|
|
29
|
+
permission: string;
|
|
30
|
+
friendlyName: string;
|
|
31
|
+
description: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const PERMISSION_DETAILS: Record<PERMISSIONS, IPermissionDetails> = {
|
|
35
|
+
[PERMISSIONS.ROOT]: {
|
|
36
|
+
permission: PERMISSIONS.ROOT,
|
|
37
|
+
friendlyName: 'Root Access',
|
|
38
|
+
description: 'Full access to all systems and resources',
|
|
39
|
+
},
|
|
40
|
+
[PERMISSIONS.MANAGE_USERS]: {
|
|
41
|
+
permission: PERMISSIONS.MANAGE_USERS,
|
|
42
|
+
friendlyName: 'Manage Users',
|
|
43
|
+
description: 'Can create, update, and delete users',
|
|
44
|
+
},
|
|
45
|
+
[PERMISSIONS.READ_USERS]: {
|
|
46
|
+
permission: PERMISSIONS.READ_USERS,
|
|
47
|
+
friendlyName: 'Read Users',
|
|
48
|
+
description: 'Can view user details',
|
|
49
|
+
},
|
|
50
|
+
[PERMISSIONS.MANAGE_ROLES]: {
|
|
51
|
+
permission: PERMISSIONS.MANAGE_ROLES,
|
|
52
|
+
friendlyName: 'Manage Roles',
|
|
53
|
+
description: 'Can create, update, and delete roles',
|
|
54
|
+
},
|
|
55
|
+
[PERMISSIONS.READ_ROLES]: {
|
|
56
|
+
permission: PERMISSIONS.READ_ROLES,
|
|
57
|
+
friendlyName: 'Read Roles',
|
|
58
|
+
description: 'Can view role details',
|
|
59
|
+
},
|
|
60
|
+
[PERMISSIONS.MANAGE_GAMESERVERS]: {
|
|
61
|
+
permission: PERMISSIONS.MANAGE_GAMESERVERS,
|
|
62
|
+
friendlyName: 'Manage Game Servers',
|
|
63
|
+
description: 'Can create, update, and delete game servers',
|
|
64
|
+
},
|
|
65
|
+
[PERMISSIONS.READ_MODULES]: {
|
|
66
|
+
permission: PERMISSIONS.READ_MODULES,
|
|
67
|
+
friendlyName: 'Read Modules',
|
|
68
|
+
description: 'Can view module details',
|
|
69
|
+
},
|
|
70
|
+
[PERMISSIONS.MANAGE_MODULES]: {
|
|
71
|
+
permission: PERMISSIONS.MANAGE_MODULES,
|
|
72
|
+
friendlyName: 'Manage Modules',
|
|
73
|
+
description: 'Can create, update, and delete modules',
|
|
74
|
+
},
|
|
75
|
+
[PERMISSIONS.READ_PLAYERS]: {
|
|
76
|
+
permission: PERMISSIONS.READ_PLAYERS,
|
|
77
|
+
friendlyName: 'Read Players',
|
|
78
|
+
description: 'Can view player details',
|
|
79
|
+
},
|
|
80
|
+
[PERMISSIONS.MANAGE_PLAYERS]: {
|
|
81
|
+
permission: PERMISSIONS.MANAGE_PLAYERS,
|
|
82
|
+
friendlyName: 'Manage Players',
|
|
83
|
+
description: 'Can create, update, and delete players',
|
|
84
|
+
},
|
|
85
|
+
[PERMISSIONS.MANAGE_SETTINGS]: {
|
|
86
|
+
permission: PERMISSIONS.MANAGE_SETTINGS,
|
|
87
|
+
friendlyName: 'Manage Settings',
|
|
88
|
+
description: 'Can modify settings',
|
|
89
|
+
},
|
|
90
|
+
[PERMISSIONS.READ_SETTINGS]: {
|
|
91
|
+
permission: PERMISSIONS.READ_SETTINGS,
|
|
92
|
+
friendlyName: 'Read Settings',
|
|
93
|
+
description: 'Can view settings',
|
|
94
|
+
},
|
|
95
|
+
[PERMISSIONS.READ_VARIABLES]: {
|
|
96
|
+
permission: PERMISSIONS.READ_VARIABLES,
|
|
97
|
+
friendlyName: 'Read Variables',
|
|
98
|
+
description: 'Can view variables',
|
|
99
|
+
},
|
|
100
|
+
[PERMISSIONS.MANAGE_VARIABLES]: {
|
|
101
|
+
permission: PERMISSIONS.MANAGE_VARIABLES,
|
|
102
|
+
friendlyName: 'Manage Variables',
|
|
103
|
+
description: 'Can create, update, and delete variables',
|
|
104
|
+
},
|
|
105
|
+
[PERMISSIONS.READ_EVENTS]: {
|
|
106
|
+
permission: PERMISSIONS.READ_EVENTS,
|
|
107
|
+
friendlyName: 'Read Events',
|
|
108
|
+
description: 'Can view event details',
|
|
109
|
+
},
|
|
110
|
+
[PERMISSIONS.MANAGE_EVENTS]: {
|
|
111
|
+
permission: PERMISSIONS.MANAGE_EVENTS,
|
|
112
|
+
friendlyName: 'Manage Events',
|
|
113
|
+
description: 'Can create, update, and delete events',
|
|
114
|
+
},
|
|
115
|
+
[PERMISSIONS.READ_ITEMS]: {
|
|
116
|
+
permission: PERMISSIONS.READ_ITEMS,
|
|
117
|
+
friendlyName: 'Read Items',
|
|
118
|
+
description: 'Can view item details',
|
|
119
|
+
},
|
|
120
|
+
[PERMISSIONS.MANAGE_ITEMS]: {
|
|
121
|
+
permission: PERMISSIONS.MANAGE_ITEMS,
|
|
122
|
+
friendlyName: 'Manage Items',
|
|
123
|
+
description: 'Can create, update, and delete items',
|
|
124
|
+
},
|
|
125
|
+
[PERMISSIONS.READ_ENTITIES]: {
|
|
126
|
+
permission: PERMISSIONS.READ_ENTITIES,
|
|
127
|
+
friendlyName: 'Read Entities',
|
|
128
|
+
description: 'Can view entity details',
|
|
129
|
+
},
|
|
130
|
+
[PERMISSIONS.MANAGE_ENTITIES]: {
|
|
131
|
+
permission: PERMISSIONS.MANAGE_ENTITIES,
|
|
132
|
+
friendlyName: 'Manage Entities',
|
|
133
|
+
description: 'Can create, update, and delete entities',
|
|
134
|
+
},
|
|
135
|
+
[PERMISSIONS.MANAGE_SHOP_LISTINGS]: {
|
|
136
|
+
permission: PERMISSIONS.MANAGE_SHOP_LISTINGS,
|
|
137
|
+
friendlyName: 'Manage Shop Listings',
|
|
138
|
+
description: 'Can create, update, and delete shop listings',
|
|
139
|
+
},
|
|
140
|
+
[PERMISSIONS.MANAGE_SHOP_ORDERS]: {
|
|
141
|
+
permission: PERMISSIONS.MANAGE_SHOP_ORDERS,
|
|
142
|
+
friendlyName: 'Manage Shop Orders',
|
|
143
|
+
description: 'Can view orders not belonging to the themself and perform administrative actions on them',
|
|
144
|
+
},
|
|
145
|
+
[PERMISSIONS.VIEW_DISCORD_INFO]: {
|
|
146
|
+
permission: PERMISSIONS.VIEW_DISCORD_INFO,
|
|
147
|
+
friendlyName: 'View Discord Info',
|
|
148
|
+
description: 'Can view Discord guild information including channels and roles',
|
|
149
|
+
},
|
|
150
|
+
[PERMISSIONS.SEND_DISCORD_MESSAGE]: {
|
|
151
|
+
permission: PERMISSIONS.SEND_DISCORD_MESSAGE,
|
|
152
|
+
friendlyName: 'Send Discord Messages',
|
|
153
|
+
description: 'Can send messages to Discord channels',
|
|
154
|
+
},
|
|
155
|
+
};
|
package/src/main.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"composite": true,
|
|
5
|
+
"rootDir": "./src",
|
|
6
|
+
"outDir": "./dist"
|
|
7
|
+
},
|
|
8
|
+
"include": ["./src/**/*.ts"],
|
|
9
|
+
"exclude": ["./src/**/*.test.ts"],
|
|
10
|
+
"references": [
|
|
11
|
+
{ "path": "../lib-config/tsconfig.build.json" },
|
|
12
|
+
{ "path": "../lib-util/tsconfig.build.json" }
|
|
13
|
+
]
|
|
14
|
+
}
|
package/tsconfig.json
ADDED
package/typedoc.json
ADDED