Compare commits

..

3 Commits

Author SHA1 Message Date
Kayne Ruse 9bdf3925a3 Implemented a post-validation hook 2021-12-11 09:59:57 +00:00
Kayne Ruse a299bab794 Preparing for Egg Trainer merge 2021-11-18 14:59:30 +00:00
Kayne Ruse 8460d03181 Updated package-lock.json 2021-11-17 06:14:08 +00:00
7 changed files with 132 additions and 9 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
docker_image: krgamestudios/auth-server
- name: Login to DockerHub
uses: docker/login-action@v1
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
+2
View File
@@ -26,6 +26,8 @@ Content-Type: application/json
//DOCS: Used for validating the email address specified above
GET /auth/validation?username=example&token=12345678
//DOCS: If the environment variable HOOK_POST_VALIDATION is set to a URL, then the server will send a GET message to that URL with the newly created account's index
GET https://{HOOK_POST_VALIDATION}?accountIndex={index}
###
+4 -2
View File
@@ -30,6 +30,7 @@ const question = (prompt, def = null) => {
//project configuration
const appName = await question('App Name', 'auth');
const appWebAddress = await question('Web Addr', `${appName}.example.com`);
const postValidationHook = await question('Post Validation Hook', '');
const resetAddress = await question('Reset Addr', `example.com/reset`);
const appPort = await question('App Port', '3200');
@@ -70,6 +71,7 @@ services:
environment:
- WEB_PROTOCOL=https
- WEB_ADDRESS=${appWebAddress}
- HOOK_POST_VALIDATION=${postValidationHook}
- WEB_RESET_ADDRESS=${resetAddress}
- WEB_PORT=${appPort}
- DB_HOSTNAME=database
@@ -85,7 +87,7 @@ services:
- ADMIN_DEFAULT_PASSWORD=${appDefaultPass}
- SECRET_ACCESS=${appSecretAccess}
- SECRET_REFRESH=${appSecretRefresh}
networks:
networks:
- app-network
depends_on:
- database
@@ -96,7 +98,7 @@ services:
MYSQL_USER: ${appDBUser}
MYSQL_PASSWORD: ${appDBPass}
MYSQL_ROOT_PASSWORD: ${dbRootPass}
networks:
networks:
- app-network
volumes:
- ./mysql:/var/lib/mysql
+104 -2
View File
@@ -1,12 +1,12 @@
{
"name": "auth-server",
"version": "1.4.3",
"version": "1.4.6",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "auth-server",
"version": "1.4.3",
"version": "1.4.6",
"license": "ISC",
"dependencies": {
"bcryptjs": "^2.4.3",
@@ -16,6 +16,7 @@
"jsonwebtoken": "^8.5.1",
"mariadb": "^2.5.4",
"node-cron": "^2.0.3",
"node-fetch": "^3.1.0",
"nodemailer": "^6.6.3",
"sequelize": "^6.6.5"
},
@@ -452,6 +453,14 @@
"node": ">=8"
}
},
"node_modules/data-uri-to-buffer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
"engines": {
"node": ">= 12"
}
},
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -637,6 +646,27 @@
"node": ">= 0.10.0"
}
},
"node_modules/fetch-blob": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz",
"integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/jimmywarting"
},
{
"type": "paypal",
"url": "https://paypal.me/jimmywarting"
}
],
"dependencies": {
"web-streams-polyfill": "^3.0.3"
},
"engines": {
"node": "^12.20 || >= 14.13"
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -666,6 +696,17 @@
"node": ">= 0.8"
}
},
"node_modules/formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"dependencies": {
"fetch-blob": "^3.1.2"
},
"engines": {
"node": ">=12.20.0"
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -1280,6 +1321,23 @@
"node": ">=6.0.0"
}
},
"node_modules/node-fetch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz",
"integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==",
"dependencies": {
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.2",
"formdata-polyfill": "^4.0.10"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/node-fetch"
}
},
"node_modules/nodemailer": {
"version": "6.6.3",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.3.tgz",
@@ -2045,6 +2103,14 @@
"node": ">= 0.8"
}
},
"node_modules/web-streams-polyfill": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz",
"integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==",
"engines": {
"node": ">= 8"
}
},
"node_modules/widest-line": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
@@ -2437,6 +2503,11 @@
"integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
"dev": true
},
"data-uri-to-buffer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -2592,6 +2663,14 @@
"vary": "~1.1.2"
}
},
"fetch-blob": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz",
"integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==",
"requires": {
"web-streams-polyfill": "^3.0.3"
}
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -2615,6 +2694,14 @@
"unpipe": "~1.0.0"
}
},
"formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"requires": {
"fetch-blob": "^3.1.2"
}
},
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -3092,6 +3179,16 @@
"tz-offset": "0.0.1"
}
},
"node-fetch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz",
"integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==",
"requires": {
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.2",
"formdata-polyfill": "^4.0.10"
}
},
"nodemailer": {
"version": "6.6.3",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.3.tgz",
@@ -3663,6 +3760,11 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"web-streams-polyfill": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz",
"integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA=="
},
"widest-line": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "auth-server",
"version": "1.4.4",
"version": "1.4.6",
"description": "An API centric auth server. Uses Sequelize and mariaDB by default.",
"main": "server/server.js",
"scripts": {
@@ -26,6 +26,7 @@
"jsonwebtoken": "^8.5.1",
"mariadb": "^2.5.4",
"node-cron": "^2.0.3",
"node-fetch": "^3.1.0",
"nodemailer": "^6.6.3",
"sequelize": "^6.6.5"
},
+17 -1
View File
@@ -1,4 +1,5 @@
const { pendingSignups, accounts } = require('../database/models');
const fetch = require('node-fetch');
//auth/validation
const route = async (req, res) => {
@@ -19,7 +20,7 @@ const route = async (req, res) => {
}
//move data to the accounts table
accounts.create({
const [account] = await accounts.upsert({
email: info.email,
username: info.username,
hash: info.hash,
@@ -35,6 +36,21 @@ const route = async (req, res) => {
//finally
res.status(200).send('Validation succeeded!');
//post-validation hook
if (process.env.HOOK_POST_VALIDATION) {
const probe = await fetch(`https://${process.env.HOOK_POST_VALIDATION}?accountIndex=${account.index}`);
if (!probe.ok) {
console.error('Could not probe the post validation hook');
} else {
console.log('Validation hook probe successful'); //TODO: remove this
}
//discard the result
} else {
console.log('No validation hook'); //TODO: remove this
}
};
module.exports = route;
+2 -2
View File
@@ -12,8 +12,8 @@ module.exports = (index, email, username, type, admin, mod) => {
mod,
};
const accessToken = jwt.sign(content, process.env.SECRET_ACCESS, { expiresIn: '10m' });
const refreshToken = jwt.sign(content, process.env.SECRET_REFRESH, { expiresIn: '30d' });
const accessToken = jwt.sign(content, process.env.SECRET_ACCESS, { expiresIn: '10m', issuer: 'auth' });
const refreshToken = jwt.sign(content, process.env.SECRET_REFRESH, { expiresIn: '30d', issuer: 'auth' });
tokens.create({ token: refreshToken, email: email });