Skip to content

Commit c7e74e0

Browse files
committed
security: remove hardcoded JWT secret and centralize random secret generation
1 parent 814f96f commit c7e74e0

File tree

6 files changed

+21
-4
lines changed

6 files changed

+21
-4
lines changed

docs/Settings.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ To enable and config the authentication:
55

66
```
77
secureEnabled: true, // enable or diasable
8-
secretCode: 'frangoteam751', // secret code to encode the token
8+
secretCode: '<strong-random-secret>', // secret code to encode the token
99
tokenExpiresIn: '1h' // token expiration delay '1h'=1hour, 60=60seconds, '1d'=1day
1010
```
1111

12-
The default user ‘admin’ have the ‘123456’ as password, of course you can change it.
12+
The default user ‘admin’ have the ‘123456’ as password, of course you can change it.

server/api/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@ function init(_server, _runtime) {
146146
if (!req.body.secretCode && runtime.settings.secretCode) {
147147
req.body.secretCode = runtime.settings.secretCode;
148148
}
149+
if (req.body.secureEnabled && !req.body.secretCode) {
150+
req.body.secretCode = utils.generateSecretCode();
151+
runtime.logger.warn('Generated random JWT secret because secureEnabled=true and no secretCode was provided.');
152+
}
149153
const prevAuth = {
150154
secureEnabled: runtime.settings.secureEnabled,
151155
tokenExpiresIn: runtime.settings.tokenExpiresIn,

server/api/jwt-helper.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
'use strict';
22

33
const jwt = require('jsonwebtoken');
4+
const utils = require('../runtime/utils');
45

56
var secureEnabled = false;
6-
var secretCode = 'frangoteam751';
7+
// Runtime fallback secret used only when no persistent secret is configured.
8+
var secretCode = utils.generateSecretCode();
79
var tokenExpiresIn = 60 * 60; // 60 minutes
810
const adminGroups = [-1, 255];
911

server/main.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,12 @@ try {
194194
logger.error('Error loading user settings file: ' + userSettingsFile)
195195
}
196196

197+
// Ensure secure mode never runs with an empty/static-known JWT secret.
198+
if (settings.secureEnabled && !settings.secretCode) {
199+
settings.secretCode = utils.generateSecretCode();
200+
logger.warn('Generated a random JWT secret in memory because secureEnabled=true and secretCode was missing. Persist it in settings for stable sessions across restarts.');
201+
}
202+
197203
// Check logger
198204
if (!settings.logDir) {
199205
settings.logDir = path.resolve(rootDir, '_logs');

server/runtime/utils.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const os = require('os');
22
const ip = require('ip');
3+
const crypto = require('crypto');
34

45
'use strict';
56
var utils = module.exports = {
@@ -361,5 +362,9 @@ var utils = module.exports = {
361362
}
362363
}
363364
return target;
365+
},
366+
367+
generateSecretCode: function(byteLength = 32) {
368+
return crypto.randomBytes(byteLength).toString('hex');
364369
}
365370
}

server/settings.default.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ module.exports = {
9292

9393
// Used to enable security, authentication and authorization and crypt Token
9494
//secureEnabled: true,
95-
//secretCode: 'frangoteam751',
95+
//secretCode: '<set-a-strong-random-secret>',
9696
//tokenExpiresIn: '1h', // '1h'=1hour, 60=60seconds, '1d'=1day
9797
//enableRefreshCookieAuth: false, // if true, use refresh token HttpOnly cookie flow
9898
//refreshTokenExpiresIn: '7d' // '7d'=7days, 12h=12hours, 3600=3600seconds

0 commit comments

Comments
 (0)