Migrated JWT secrets over to new Storage system and improved secrets storage performance
This commit is contained in:
parent
4738228d36
commit
eeb3e36fc4
2 changed files with 13 additions and 76 deletions
|
|
@ -7,90 +7,32 @@ const uuidv1 = require('uuid/v1')
|
||||||
const jsonfile = require('jsonfile')
|
const jsonfile = require('jsonfile')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const logger = require('winston')
|
const logger = require('winston')
|
||||||
|
const Storage = require('node-persist')
|
||||||
const FS = require('../../utils/fs')
|
const FS = require('../../utils/fs')
|
||||||
|
|
||||||
const rootFolder = process.resourcesPath || __dirname
|
const rootFolder = process.resourcesPath || __dirname
|
||||||
const secretsFilePath = path.resolve(rootFolder, 'secrets.json')
|
const secretsFilePath = path.resolve(rootFolder, 'secrets.json')
|
||||||
|
|
||||||
class Auth {
|
class Auth {
|
||||||
verifySecretsFile = async () => {
|
readSecrets = async () => {
|
||||||
try {
|
const secrets = await Storage.get('auth/secrets')
|
||||||
const fileExists = await FS.access(secretsFilePath)
|
|
||||||
|
|
||||||
if (!fileExists) {
|
if (secrets) {
|
||||||
return { exists: false }
|
return secrets
|
||||||
}
|
|
||||||
|
|
||||||
const secretsFile = await FS.readFile(secretsFilePath, {
|
|
||||||
encoding: 'utf8'
|
|
||||||
})
|
|
||||||
|
|
||||||
// Check if secrets file has valid JSON
|
|
||||||
JSON.parse(secretsFile)
|
|
||||||
|
|
||||||
return { exists: true, parsable: true }
|
|
||||||
} catch (err) {
|
|
||||||
logger.error(err)
|
|
||||||
return { exists: true, parsable: false }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const newSecrets = await Storage.set('auth/secrets', {})
|
||||||
|
|
||||||
|
return newSecrets
|
||||||
}
|
}
|
||||||
|
|
||||||
initSecretsFile = async () => {
|
|
||||||
const { exists, parsable } = await this.verifySecretsFile()
|
|
||||||
|
|
||||||
if (exists && parsable) {
|
|
||||||
// logger.info('Secrets file exists!')
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if (exists && !parsable) {
|
|
||||||
await FS.unlink(secretsFilePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
await FS.writeFile(secretsFilePath, '{}')
|
|
||||||
|
|
||||||
logger.info('New secrets file generated!')
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
readSecrets = () =>
|
|
||||||
new Promise((resolve, reject) => {
|
|
||||||
this.initSecretsFile()
|
|
||||||
.then(() => {
|
|
||||||
jsonfile.readFile(secretsFilePath, (err, allSecrets) => {
|
|
||||||
if (err) {
|
|
||||||
logger.error('readSecrets err', err)
|
|
||||||
reject('Problem reading secrets file')
|
|
||||||
} else {
|
|
||||||
resolve(allSecrets)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.catch(reject)
|
|
||||||
})
|
|
||||||
|
|
||||||
async writeSecrets(key, value) {
|
async writeSecrets(key, value) {
|
||||||
await this.initSecretsFile()
|
|
||||||
const allSecrets = await this.readSecrets()
|
const allSecrets = await this.readSecrets()
|
||||||
return new Promise((resolve, reject) => {
|
const newSecrets = await Storage.set('auth/secrets', {
|
||||||
allSecrets[key] = value
|
...allSecrets,
|
||||||
logger.info('Writing new secret:', secretsFilePath)
|
[key]: value
|
||||||
jsonfile.writeFile(
|
|
||||||
secretsFilePath,
|
|
||||||
allSecrets,
|
|
||||||
{ spaces: 2, EOL: '\r\n' },
|
|
||||||
err => {
|
|
||||||
if (err) {
|
|
||||||
logger.error('writeSecrets err', err)
|
|
||||||
reject(err)
|
|
||||||
} else {
|
|
||||||
logger.info('New secret saved!')
|
|
||||||
resolve(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
return newSecrets
|
||||||
}
|
}
|
||||||
|
|
||||||
async generateToken() {
|
async generateToken() {
|
||||||
|
|
@ -111,7 +53,6 @@ class Auth {
|
||||||
|
|
||||||
async validateToken(token) {
|
async validateToken(token) {
|
||||||
try {
|
try {
|
||||||
await this.initSecretsFile()
|
|
||||||
const key = jwt.decode(token).data.timestamp
|
const key = jwt.decode(token).data.timestamp
|
||||||
const secrets = await this.readSecrets()
|
const secrets = await this.readSecrets()
|
||||||
const secret = secrets[key]
|
const secret = secrets[key]
|
||||||
|
|
|
||||||
|
|
@ -2767,8 +2767,4 @@ module.exports = async (
|
||||||
data: isAuthenticated()
|
data: isAuthenticated()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
/**
|
|
||||||
* Return app so that it can be used by express.
|
|
||||||
*/
|
|
||||||
// return app;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue