@semapps/auth 1.1.4 → 1.2.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.
Files changed (67) hide show
  1. package/dist/index.d.ts +8 -0
  2. package/dist/index.js +9 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/middlewares/localLogout.d.ts +2 -0
  5. package/dist/middlewares/localLogout.js +6 -0
  6. package/dist/middlewares/localLogout.js.map +1 -0
  7. package/dist/middlewares/redirectToFront.d.ts +2 -0
  8. package/dist/middlewares/redirectToFront.js +15 -0
  9. package/dist/middlewares/redirectToFront.js.map +1 -0
  10. package/dist/middlewares/saveRedirectUrl.d.ts +2 -0
  11. package/dist/middlewares/saveRedirectUrl.js +9 -0
  12. package/dist/middlewares/saveRedirectUrl.js.map +1 -0
  13. package/dist/middlewares/sendToken.d.ts +2 -0
  14. package/dist/middlewares/sendToken.js +6 -0
  15. package/dist/middlewares/sendToken.js.map +1 -0
  16. package/dist/mixins/auth.d.ts +92 -0
  17. package/dist/mixins/auth.js +235 -0
  18. package/dist/mixins/auth.js.map +1 -0
  19. package/dist/mixins/auth.sso.d.ts +68 -0
  20. package/dist/mixins/auth.sso.js +82 -0
  21. package/dist/mixins/auth.sso.js.map +1 -0
  22. package/dist/services/account.d.ts +88 -0
  23. package/dist/services/account.js +324 -0
  24. package/dist/services/account.js.map +1 -0
  25. package/dist/services/auth.cas.d.ts +92 -0
  26. package/dist/services/auth.cas.js +43 -0
  27. package/dist/services/auth.cas.js.map +1 -0
  28. package/dist/services/auth.local.d.ts +126 -0
  29. package/dist/services/auth.local.js +230 -0
  30. package/dist/services/auth.local.js.map +1 -0
  31. package/dist/services/auth.oidc.d.ts +94 -0
  32. package/dist/services/auth.oidc.js +64 -0
  33. package/dist/services/auth.oidc.js.map +1 -0
  34. package/dist/services/jwt.d.ts +40 -0
  35. package/dist/services/jwt.js +111 -0
  36. package/dist/services/jwt.js.map +1 -0
  37. package/dist/services/mail.d.ts +29 -0
  38. package/dist/services/mail.js +52 -0
  39. package/dist/services/mail.js.map +1 -0
  40. package/dist/services/migration.d.ts +16 -0
  41. package/dist/services/migration.js +33 -0
  42. package/dist/services/migration.js.map +1 -0
  43. package/dist/tsconfig.tsbuildinfo +1 -0
  44. package/index.ts +17 -0
  45. package/middlewares/localLogout.ts +6 -0
  46. package/middlewares/{redirectToFront.js → redirectToFront.ts} +2 -2
  47. package/middlewares/{saveRedirectUrl.js → saveRedirectUrl.ts} +2 -2
  48. package/middlewares/{sendToken.js → sendToken.ts} +2 -2
  49. package/mixins/auth.sso.ts +100 -0
  50. package/mixins/{auth.js → auth.ts} +86 -67
  51. package/package.json +19 -9
  52. package/services/account.ts +382 -0
  53. package/services/{auth.cas.js → auth.cas.ts} +20 -9
  54. package/services/auth.local.ts +277 -0
  55. package/services/{auth.oidc.js → auth.oidc.ts} +22 -9
  56. package/services/jwt.ts +127 -0
  57. package/services/mail.ts +67 -0
  58. package/services/migration.ts +43 -0
  59. package/tsconfig.json +10 -0
  60. package/index.js +0 -9
  61. package/middlewares/localLogout.js +0 -6
  62. package/mixins/auth.sso.js +0 -93
  63. package/services/account.js +0 -315
  64. package/services/auth.local.js +0 -238
  65. package/services/jwt.js +0 -101
  66. package/services/mail.js +0 -49
  67. package/services/migration.js +0 -29
@@ -0,0 +1,126 @@
1
+ import moleculer from 'moleculer';
2
+ /** @type {import('moleculer').ServiceSchema} */
3
+ declare const AuthLocalService: {
4
+ name: "auth";
5
+ mixins: {
6
+ settings: {
7
+ baseUrl: null;
8
+ jwtPath: null;
9
+ capabilitiesPath: undefined;
10
+ registrationAllowed: boolean;
11
+ reservedUsernames: never[];
12
+ minPasswordLength: number;
13
+ minUsernameLength: number;
14
+ webIdSelection: never[];
15
+ accountSelection: never[];
16
+ accountsDataset: string;
17
+ podProvider: boolean;
18
+ };
19
+ dependencies: string[];
20
+ created(this: moleculer.Service<moleculer.ServiceSettingSchema>): Promise<void>;
21
+ started(this: moleculer.Service<moleculer.ServiceSettingSchema>): Promise<void>;
22
+ actions: {
23
+ authenticate: {
24
+ handler(ctx: moleculer.Context<any, any, moleculer.GenericObject>): Promise<any>;
25
+ };
26
+ authorize: {
27
+ handler(ctx: moleculer.Context<any, any, moleculer.GenericObject>): Promise<any>;
28
+ };
29
+ impersonate: {
30
+ handler(ctx: moleculer.Context<any, any, moleculer.GenericObject>): Promise<unknown>;
31
+ };
32
+ };
33
+ methods: {
34
+ validateCapability(ctx: any, token: any): Promise<any>;
35
+ getStrategy(): never;
36
+ getApiRoutes(): never;
37
+ pickWebIdData(data: any): any;
38
+ pickAccountData(data: any): {
39
+ [k: string]: any;
40
+ };
41
+ };
42
+ }[];
43
+ settings: {
44
+ baseUrl: null;
45
+ jwtPath: null;
46
+ registrationAllowed: boolean;
47
+ reservedUsernames: never[];
48
+ minPasswordLength: number;
49
+ minUsernameLength: number;
50
+ webIdSelection: never[];
51
+ accountSelection: never[];
52
+ formUrl: null;
53
+ mail: {
54
+ from: null;
55
+ transport: {
56
+ host: null;
57
+ port: null;
58
+ };
59
+ defaults: {
60
+ locale: null;
61
+ frontUrl: null;
62
+ };
63
+ };
64
+ };
65
+ dependencies: string[];
66
+ created(this: moleculer.Service<moleculer.ServiceSettingSchema>): Promise<void>;
67
+ actions: {
68
+ signup: {
69
+ handler(ctx: moleculer.Context<any, any, moleculer.GenericObject>): Promise<{
70
+ token: unknown;
71
+ webId: unknown;
72
+ newUser: boolean;
73
+ }>;
74
+ };
75
+ login: {
76
+ handler(ctx: moleculer.Context<any, any, moleculer.GenericObject>): Promise<{
77
+ token: unknown;
78
+ webId: any;
79
+ newUser: boolean;
80
+ }>;
81
+ };
82
+ logout: {
83
+ handler(ctx: moleculer.Context<any, any, moleculer.GenericObject>): Promise<void>;
84
+ };
85
+ redirectToForm: {
86
+ handler(ctx: moleculer.Context<any, any, moleculer.GenericObject>): Promise<void>;
87
+ };
88
+ resetPassword: {
89
+ handler(ctx: moleculer.Context<any, any, moleculer.GenericObject>): Promise<void>;
90
+ };
91
+ setNewPassword: {
92
+ handler(ctx: moleculer.Context<any, any, moleculer.GenericObject>): Promise<void>;
93
+ };
94
+ };
95
+ methods: {
96
+ getStrategy(): any;
97
+ getApiRoutes(basePath: any): ({
98
+ path: string;
99
+ name: string;
100
+ use: any[];
101
+ aliases: {
102
+ 'POST /': any[];
103
+ };
104
+ } | {
105
+ path: string;
106
+ name: string;
107
+ aliases: {
108
+ 'GET /': string;
109
+ };
110
+ } | {
111
+ path: string;
112
+ name: string;
113
+ aliases: {
114
+ 'POST /': string;
115
+ };
116
+ })[];
117
+ };
118
+ };
119
+ export default AuthLocalService;
120
+ declare global {
121
+ export namespace Moleculer {
122
+ interface AllServices {
123
+ [AuthLocalService.name]: typeof AuthLocalService;
124
+ }
125
+ }
126
+ }
@@ -0,0 +1,230 @@
1
+ import path from 'path';
2
+ // @ts-expect-error TS(7016): Could not find a declaration file for module 'pass... Remove this comment to see the full error message
3
+ import { Strategy } from 'passport-local';
4
+ import AuthMixin from "../mixins/auth.js";
5
+ import sendToken from "../middlewares/sendToken.js";
6
+ import AuthMailService from "./mail.js";
7
+ import moleculer from 'moleculer';
8
+ const { Errors } = moleculer;
9
+ const { MoleculerError } = Errors;
10
+ /** @type {import('moleculer').ServiceSchema} */
11
+ const AuthLocalService = {
12
+ name: 'auth',
13
+ mixins: [AuthMixin],
14
+ settings: {
15
+ baseUrl: null,
16
+ jwtPath: null,
17
+ registrationAllowed: true,
18
+ reservedUsernames: [],
19
+ minPasswordLength: 1,
20
+ minUsernameLength: 1,
21
+ webIdSelection: [],
22
+ accountSelection: [],
23
+ formUrl: null,
24
+ mail: {
25
+ from: null,
26
+ transport: {
27
+ host: null,
28
+ port: null
29
+ },
30
+ defaults: {
31
+ locale: null,
32
+ frontUrl: null
33
+ }
34
+ }
35
+ },
36
+ dependencies: ['webid'],
37
+ async created() {
38
+ const { mail } = this.settings;
39
+ this.passportId = 'local';
40
+ if (mail !== false) {
41
+ // @ts-expect-error TS(2345): Argument of type '{ mixins: { name: "auth.mail"; m... Remove this comment to see the full error message
42
+ this.broker.createService({
43
+ mixins: [AuthMailService],
44
+ settings: {
45
+ ...mail
46
+ }
47
+ });
48
+ }
49
+ },
50
+ actions: {
51
+ signup: {
52
+ async handler(ctx) {
53
+ const { username, email, password, ...rest } = ctx.params;
54
+ // This is going to get in our way otherwise when waiting for completions.
55
+ // @ts-expect-error TS(2339): Property 'skipObjectsWatcher' does not exist on ty... Remove this comment to see the full error message
56
+ ctx.meta.skipObjectsWatcher = true;
57
+ let accountData = await ctx.call('auth.account.create', {
58
+ username,
59
+ email,
60
+ password,
61
+ ...this.pickAccountData(rest)
62
+ });
63
+ try {
64
+ const profileData = { nick: accountData.username, email: accountData.email, ...rest };
65
+ const webId = await ctx.call('webid.createWebId', this.pickWebIdData(profileData), {
66
+ meta: {
67
+ isSignup: true // Allow services to handle directly the webId creation if it is generated by the AuthService
68
+ }
69
+ });
70
+ // Link the webId with the account
71
+ accountData = await ctx.call('auth.account.attachWebId', { accountUri: accountData['@id'], webId });
72
+ ctx.emit('auth.registered', { webId, profileData, accountData });
73
+ const token = await ctx.call('auth.jwt.generateServerSignedToken', { payload: { webId } });
74
+ return { token, webId, newUser: true };
75
+ }
76
+ catch (e) {
77
+ // Delete account if resource creation failed, or it may cause problems when retrying
78
+ await ctx.call('auth.account.remove', { id: accountData['@id'] });
79
+ throw e;
80
+ }
81
+ }
82
+ },
83
+ login: {
84
+ async handler(ctx) {
85
+ const { username, password } = ctx.params;
86
+ const accountData = await ctx.call('auth.account.verify', { username, password });
87
+ ctx.emit('auth.connected', { webId: accountData.webId, accountData }, { meta: { webId: null, dataset: null } });
88
+ const token = await ctx.call('auth.jwt.generateServerSignedToken', { payload: { webId: accountData.webId } });
89
+ return { token, webId: accountData.webId, newUser: false };
90
+ }
91
+ },
92
+ logout: {
93
+ async handler(ctx) {
94
+ // @ts-expect-error TS(2339): Property '$statusCode' does not exist on type '{}'... Remove this comment to see the full error message
95
+ ctx.meta.$statusCode = 302;
96
+ // @ts-expect-error TS(2339): Property '$location' does not exist on type '{}'.
97
+ ctx.meta.$location = ctx.params.redirectUrl || this.settings.formUrl;
98
+ // @ts-expect-error TS(2339): Property 'webId' does not exist on type '{}'.
99
+ ctx.emit('auth.disconnected', { webId: ctx.meta.webId });
100
+ }
101
+ },
102
+ redirectToForm: {
103
+ async handler(ctx) {
104
+ if (this.settings.formUrl) {
105
+ const formUrl = new URL(this.settings.formUrl);
106
+ if (ctx.params) {
107
+ for (const [key, value] of Object.entries(ctx.params)) {
108
+ formUrl.searchParams.set(key, value);
109
+ }
110
+ }
111
+ // @ts-expect-error TS(2339): Property '$statusCode' does not exist on type '{}'... Remove this comment to see the full error message
112
+ ctx.meta.$statusCode = 302;
113
+ // @ts-expect-error TS(2339): Property '$location' does not exist on type '{}'.
114
+ ctx.meta.$location = formUrl.toString();
115
+ }
116
+ else {
117
+ throw new Error('No formUrl defined in auth.local settings');
118
+ }
119
+ }
120
+ },
121
+ resetPassword: {
122
+ async handler(ctx) {
123
+ const { email } = ctx.params;
124
+ const account = await ctx.call('auth.account.findByEmail', { email });
125
+ if (!account) {
126
+ throw new MoleculerError('email.not.exists', 400, 'BAD_REQUEST');
127
+ }
128
+ const token = await ctx.call('auth.account.generateResetPasswordToken', { webId: account.webId });
129
+ await ctx.call('auth.mail.sendResetPasswordEmail', {
130
+ account,
131
+ token
132
+ });
133
+ }
134
+ },
135
+ setNewPassword: {
136
+ async handler(ctx) {
137
+ const { email, token, password } = ctx.params;
138
+ const account = await ctx.call('auth.account.findByEmail', { email });
139
+ if (!account) {
140
+ throw new MoleculerError('email.not.exists', 400, 'BAD_REQUEST');
141
+ }
142
+ await ctx.call('auth.account.setNewPassword', { webId: account.webId, token, password });
143
+ }
144
+ }
145
+ },
146
+ methods: {
147
+ getStrategy() {
148
+ return new Strategy({
149
+ passReqToCallback: true // We want to have access to req below
150
+ }, (req, username, password, done) => {
151
+ req.$ctx
152
+ .call('auth.login', req.$params)
153
+ .then((returnedData) => {
154
+ done(null, returnedData);
155
+ })
156
+ .catch((e) => {
157
+ done(new MoleculerError(e.message, 401), false);
158
+ });
159
+ });
160
+ },
161
+ getApiRoutes(basePath) {
162
+ const loginRoute = {
163
+ path: path.join(basePath, '/auth/login'),
164
+ name: 'auth-login',
165
+ use: [this.passport.initialize()],
166
+ aliases: {
167
+ 'POST /': [this.passport.authenticate(this.passportId, { session: false }), sendToken]
168
+ }
169
+ };
170
+ const logoutRoute = {
171
+ path: path.join(basePath, '/auth/logout'),
172
+ name: 'auth-logout',
173
+ aliases: {
174
+ 'GET /': 'auth.logout'
175
+ }
176
+ };
177
+ const signupRoute = {
178
+ path: path.join(basePath, '/auth/signup'),
179
+ name: 'auth-signup',
180
+ aliases: {
181
+ 'POST /': 'auth.signup'
182
+ }
183
+ };
184
+ const formRoute = {
185
+ path: path.join(basePath, '/auth'),
186
+ name: 'auth',
187
+ aliases: {
188
+ 'GET /': 'auth.redirectToForm'
189
+ }
190
+ };
191
+ const resetPasswordRoute = {
192
+ path: path.join(basePath, '/auth/reset_password'),
193
+ name: 'auth-reset-password',
194
+ aliases: {
195
+ 'POST /': 'auth.resetPassword'
196
+ }
197
+ };
198
+ const setNewPasswordRoute = {
199
+ path: path.join(basePath, '/auth/new_password'),
200
+ name: 'auth-new-password',
201
+ aliases: {
202
+ 'POST /': 'auth.setNewPassword'
203
+ }
204
+ };
205
+ const accountSettingsRoute = {
206
+ path: path.join(basePath, '/auth/account'),
207
+ name: 'auth-account',
208
+ aliases: {
209
+ 'GET /': 'auth.account.findSettingsByWebId',
210
+ 'POST /': 'auth.account.updateAccountSettings'
211
+ },
212
+ authorization: true
213
+ };
214
+ const routes = [
215
+ loginRoute,
216
+ logoutRoute,
217
+ formRoute,
218
+ resetPasswordRoute,
219
+ setNewPasswordRoute,
220
+ accountSettingsRoute
221
+ ];
222
+ if (this.settings.registrationAllowed) {
223
+ return [...routes, signupRoute];
224
+ }
225
+ return routes;
226
+ }
227
+ }
228
+ };
229
+ export default AuthLocalService;
230
+ //# sourceMappingURL=auth.local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.local.js","sourceRoot":"","sources":["../../services/auth.local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ declare const AuthOIDCService: {
2
+ name: "auth";
3
+ mixins: {
4
+ mixins: {
5
+ settings: {
6
+ baseUrl: null;
7
+ jwtPath: null;
8
+ capabilitiesPath: undefined;
9
+ registrationAllowed: boolean;
10
+ reservedUsernames: never[];
11
+ minPasswordLength: number;
12
+ minUsernameLength: number;
13
+ webIdSelection: never[];
14
+ accountSelection: never[];
15
+ accountsDataset: string;
16
+ podProvider: boolean;
17
+ };
18
+ dependencies: string[];
19
+ created(this: import("moleculer").Service<import("moleculer").ServiceSettingSchema>): Promise<void>;
20
+ started(this: import("moleculer").Service<import("moleculer").ServiceSettingSchema>): Promise<void>;
21
+ actions: {
22
+ authenticate: {
23
+ handler(ctx: import("moleculer").Context<any, any, import("moleculer").GenericObject>): Promise<any>;
24
+ };
25
+ authorize: {
26
+ handler(ctx: import("moleculer").Context<any, any, import("moleculer").GenericObject>): Promise<any>;
27
+ };
28
+ impersonate: {
29
+ handler(ctx: import("moleculer").Context<any, any, import("moleculer").GenericObject>): Promise<unknown>;
30
+ };
31
+ };
32
+ methods: {
33
+ validateCapability(ctx: any, token: any): Promise<any>;
34
+ getStrategy(): never;
35
+ getApiRoutes(): never;
36
+ pickWebIdData(data: any): any;
37
+ pickAccountData(data: any): {
38
+ [k: string]: any;
39
+ };
40
+ };
41
+ }[];
42
+ settings: {
43
+ baseUrl: null;
44
+ jwtPath: null;
45
+ registrationAllowed: boolean;
46
+ reservedUsernames: never[];
47
+ webIdSelection: never[];
48
+ sessionSecret: string;
49
+ selectSsoData: null;
50
+ };
51
+ actions: {
52
+ loginOrSignup: {
53
+ handler(ctx: import("moleculer").Context<any, any, import("moleculer").GenericObject>): Promise<{
54
+ token: unknown;
55
+ newUser: boolean;
56
+ }>;
57
+ };
58
+ };
59
+ methods: {
60
+ getApiRoutes(basePath: any): {
61
+ path: string;
62
+ name: string;
63
+ use: any[];
64
+ aliases: {
65
+ 'GET /': any[];
66
+ };
67
+ }[];
68
+ };
69
+ }[];
70
+ settings: {
71
+ baseUrl: null;
72
+ jwtPath: null;
73
+ registrationAllowed: boolean;
74
+ reservedUsernames: never[];
75
+ webIdSelection: never[];
76
+ sessionSecret: string;
77
+ selectSsoData: null;
78
+ issuer: null;
79
+ clientId: null;
80
+ clientSecret: null;
81
+ };
82
+ created(this: import("moleculer").Service<import("moleculer").ServiceSettingSchema>): Promise<void>;
83
+ methods: {
84
+ getStrategy(): Promise<any>;
85
+ };
86
+ };
87
+ export default AuthOIDCService;
88
+ declare global {
89
+ export namespace Moleculer {
90
+ interface AllServices {
91
+ [AuthOIDCService.name]: typeof AuthOIDCService;
92
+ }
93
+ }
94
+ }
@@ -0,0 +1,64 @@
1
+ import urlJoin from 'url-join';
2
+ // @ts-expect-error
3
+ import openidClient from 'openid-client';
4
+ const { Issuer, Strategy, custom } = openidClient;
5
+ import AuthSSOMixin from "../mixins/auth.sso.js";
6
+ custom.setHttpOptionsDefaults({
7
+ timeout: 10000
8
+ });
9
+ const AuthOIDCService = {
10
+ name: 'auth',
11
+ mixins: [AuthSSOMixin],
12
+ settings: {
13
+ baseUrl: null,
14
+ jwtPath: null,
15
+ registrationAllowed: true,
16
+ reservedUsernames: [],
17
+ webIdSelection: [],
18
+ // SSO-specific settings
19
+ sessionSecret: 's€m@pps',
20
+ selectSsoData: null,
21
+ // OIDC-specific settings
22
+ issuer: null,
23
+ clientId: null,
24
+ clientSecret: null
25
+ },
26
+ async created() {
27
+ this.passportId = 'oidc';
28
+ },
29
+ methods: {
30
+ async getStrategy() {
31
+ const issuer = await Issuer.discover(this.settings.issuer);
32
+ const client = new issuer.Client({
33
+ client_id: this.settings.clientId,
34
+ client_secret: this.settings.clientSecret,
35
+ redirect_uri: urlJoin(this.settings.baseUrl, 'auth'),
36
+ token_endpoint_auth_method: this.settings.clientSecret ? undefined : 'none'
37
+ });
38
+ const params = {
39
+ // ... any authorization params override client properties
40
+ // client_id defaults to client.client_id
41
+ // redirect_uri defaults to client.redirect_uris[0]
42
+ // response type defaults to client.response_types[0], then 'code'
43
+ // scope defaults to 'openid'
44
+ };
45
+ return new Strategy({
46
+ client,
47
+ params,
48
+ passReqToCallback: true
49
+ }, (req, tokenset, userinfo, done) => {
50
+ req.$ctx
51
+ .call('auth.loginOrSignup', { ssoData: userinfo })
52
+ .then((loginData) => {
53
+ done(null, loginData);
54
+ })
55
+ .catch((e) => {
56
+ console.error(e);
57
+ done(null, false);
58
+ });
59
+ });
60
+ }
61
+ }
62
+ };
63
+ export default AuthOIDCService;
64
+ //# sourceMappingURL=auth.oidc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.oidc.js","sourceRoot":"","sources":["../../services/auth.oidc.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAC;AAC/B,mBAAmB;AACnB,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;AAGlD,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAEjD,MAAM,CAAC,sBAAsB,CAAC;IAC5B,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,MAAe;IACrB,MAAM,EAAE,CAAC,YAAY,CAAC;IACtB,QAAQ,EAAE;QACR,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,mBAAmB,EAAE,IAAI;QACzB,iBAAiB,EAAE,EAAE;QACrB,cAAc,EAAE,EAAE;QAClB,wBAAwB;QACxB,aAAa,EAAE,SAAS;QACxB,aAAa,EAAE,IAAI;QACnB,yBAAyB;QACzB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI;KACnB;IACD,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE;QACP,KAAK,CAAC,WAAW;YACf,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE3D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC;gBAC/B,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;gBACjC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY;gBACzC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBACpD,0BAA0B,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;aAC5E,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG;YACb,0DAA0D;YAC1D,yCAAyC;YACzC,mDAAmD;YACnD,kEAAkE;YAClE,6BAA6B;aAC9B,CAAC;YAEF,OAAO,IAAI,QAAQ,CACjB;gBACE,MAAM;gBACN,MAAM;gBACN,iBAAiB,EAAE,IAAI;aACxB,EACD,CAAC,GAAQ,EAAE,QAAa,EAAE,QAAa,EAAE,IAAS,EAAE,EAAE;gBACpD,GAAG,CAAC,IAAI;qBACL,IAAI,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;qBACjD,IAAI,CAAC,CAAC,SAAc,EAAE,EAAE;oBACvB,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACxB,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;oBAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACjB,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACpB,CAAC,CAAC,CAAC;YACP,CAAC,CACF,CAAC;QACJ,CAAC;KACF;CACsB,CAAC;AAE1B,eAAe,eAAe,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Service that creates and validates JSON web tokens(JWT).
3
+ * Tokens are signed against this server's keys.
4
+ * This is useful for generating/validating authentication tokens.
5
+ *
6
+ * TODO: Tokens do not expire.
7
+ */
8
+ declare const AuthJwtSchema: {
9
+ name: "auth.jwt";
10
+ settings: {
11
+ jwtPath: null;
12
+ };
13
+ created(this: import("moleculer").Service<import("moleculer").ServiceSettingSchema>): Promise<void>;
14
+ actions: {
15
+ generateKeyPair: {
16
+ handler(ctx: import("moleculer").Context<any, any, import("moleculer").GenericObject>): Promise<unknown>;
17
+ };
18
+ generateServerSignedToken: {
19
+ handler(ctx: import("moleculer").Context<any, any, import("moleculer").GenericObject>): Promise<any>;
20
+ };
21
+ verifyServerSignedToken: {
22
+ /** Verifies that the token was signed by this server. */
23
+ handler(ctx: import("moleculer").Context<any, any, import("moleculer").GenericObject>): Promise<any>;
24
+ };
25
+ generateUnsignedToken: {
26
+ handler(ctx: import("moleculer").Context<any, any, import("moleculer").GenericObject>): Promise<any>;
27
+ };
28
+ decodeToken: {
29
+ handler(ctx: import("moleculer").Context<any, any, import("moleculer").GenericObject>): Promise<any>;
30
+ };
31
+ };
32
+ };
33
+ export default AuthJwtSchema;
34
+ declare global {
35
+ export namespace Moleculer {
36
+ interface AllServices {
37
+ [AuthJwtSchema.name]: typeof AuthJwtSchema;
38
+ }
39
+ }
40
+ }