diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index b6502f1b97..48776d583d 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -570,7 +570,7 @@ class App { this.app.post('/token', async (req: express.Request, res: express.Response) => { const ramdonToken = randomBytes(20).toString('hex'); // @ts-ignore - await Db.collections.User!.update({ globalRole: 1 }, { apiKey: ramdonToken }); + await Db.collections.User!.update({ globalRole: 1 }, { apiKey: `n8n_api_${ramdonToken}` }); return ResponseHelper.sendSuccessResponse(res, { token: ramdonToken }, true, 200); }); diff --git a/packages/cli/src/UserManagement/routes/users.ts b/packages/cli/src/UserManagement/routes/users.ts index 3198aa9b2d..cb69f438a9 100644 --- a/packages/cli/src/UserManagement/routes/users.ts +++ b/packages/cli/src/UserManagement/routes/users.ts @@ -8,7 +8,7 @@ import { LoggerProxy as Logger } from 'n8n-workflow'; import { Db, InternalHooksManager, ITelemetryUserDeletionData, ResponseHelper } from '../..'; import { N8nApp, PublicUser } from '../Interfaces'; -import { UserRequest } from '../../requests'; +import { AuthenticatedRequest, UserRequest } from '../../requests'; import { getInstanceBaseUrl, hashPassword, @@ -23,6 +23,7 @@ import * as UserManagementMailer from '../email/UserManagementMailer'; import * as config from '../../../config'; import { issueCookie } from '../auth/jwt'; +import { randomBytes } from 'crypto'; export function usersNamespace(this: N8nApp): void { /** @@ -564,4 +565,32 @@ export function usersNamespace(this: N8nApp): void { return { success: true }; }), ); + + /** + * Creates an API Key + */ + this.app.post( + `/${this.restEndpoint}/users/me/api-key`, + ResponseHelper.send(async (req: AuthenticatedRequest) => { + const ramdonToken = randomBytes(20).toString('hex'); + const apiKey = `n8n_api_${ramdonToken}`; + await Db.collections.User!.update(req.user.id, { + apiKey, + }); + return { apiKey, success: true }; + }), + ); + + /** + * Deletes an API Key + */ + this.app.delete( + `/${this.restEndpoint}/users/me/api-key`, + ResponseHelper.send(async (req: AuthenticatedRequest) => { + await Db.collections.User!.update(req.user.id, { + apiKey: null, + }); + return { success: true }; + }), + ); }