Reworking JWT authentication
This commit is contained in:
@@ -19,9 +19,11 @@ Content-Type: application/json
|
|||||||
"password": "helloworld"
|
"password": "helloworld"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//DOCS: Used for validating the email address above
|
//DOCS: Used for validating the email address above
|
||||||
GET /auth/validation?username=example&token=12345678
|
GET /auth/validation?username=example&token=12345678
|
||||||
|
|
||||||
|
|
||||||
//DOCS: Login after validation
|
//DOCS: Login after validation
|
||||||
POST /auth/login
|
POST /auth/login
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
@@ -37,7 +39,8 @@ Content-Type: application/json
|
|||||||
"refreshToken": "fghij"
|
"refreshToken": "fghij"
|
||||||
}
|
}
|
||||||
|
|
||||||
//Replace an expired authToken pair with these values
|
|
||||||
|
//DOCS: Replace an expired authToken pair with these values
|
||||||
POST /auth/token
|
POST /auth/token
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
|
|
||||||
@@ -45,6 +48,7 @@ Content-Type: application/json
|
|||||||
"token": "refreshToken"
|
"token": "refreshToken"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//DOCS: After this is called, the refresh route will no longer work
|
//DOCS: After this is called, the refresh route will no longer work
|
||||||
DELETE /auth/logout
|
DELETE /auth/logout
|
||||||
Authorization: Bearer accessToken
|
Authorization: Bearer accessToken
|
||||||
@@ -53,6 +57,7 @@ Authorization: Bearer accessToken
|
|||||||
"token": "refreshToken"
|
"token": "refreshToken"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//DOCS: Retreives the private account data, results vary
|
//DOCS: Retreives the private account data, results vary
|
||||||
GET /auth/account
|
GET /auth/account
|
||||||
Authorization: Bearer accessToken
|
Authorization: Bearer accessToken
|
||||||
@@ -63,11 +68,13 @@ Authorization: Bearer accessToken
|
|||||||
"refreshToken": "fghij"
|
"refreshToken": "fghij"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//DOCS: Update account data, input varies, but is always JSON
|
//DOCS: Update account data, input varies, but is always JSON
|
||||||
PATCH /auth/account
|
PATCH /auth/account
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Authorization: Bearer accessToken
|
Authorization: Bearer accessToken
|
||||||
|
|
||||||
|
|
||||||
//DOCS: Sets the timer, account will be deleted after 2 days
|
//DOCS: Sets the timer, account will be deleted after 2 days
|
||||||
DELETE /auth/account
|
DELETE /auth/account
|
||||||
Authorization: Bearer accessToken
|
Authorization: Bearer accessToken
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "auth-server",
|
"name": "auth-server",
|
||||||
"version": "1.3.2",
|
"version": "1.4.0",
|
||||||
"description": "An API centric auth server. Uses Sequelize and mariaDB by default.",
|
"description": "An API centric auth server. Uses Sequelize and mariaDB by default.",
|
||||||
"main": "server/server.js",
|
"main": "server/server.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ const route = async (req, res) => {
|
|||||||
//forcibly logout
|
//forcibly logout
|
||||||
tokens.destroy({
|
tokens.destroy({
|
||||||
where: {
|
where: {
|
||||||
username: req.body.username || ''
|
email: req.body.email || ''
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ router.use(tokenAuth);
|
|||||||
router.use(async (req, res, next) => {
|
router.use(async (req, res, next) => {
|
||||||
const record = await accounts.findOne({
|
const record = await accounts.findOne({
|
||||||
where: {
|
where: {
|
||||||
username: req.user.username || ''
|
email: req.user.email || ''
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ router.delete('/logout', require('./logout'));
|
|||||||
router.use(async (req, res, next) => {
|
router.use(async (req, res, next) => {
|
||||||
const record = await accounts.findOne({
|
const record = await accounts.findOne({
|
||||||
where: {
|
where: {
|
||||||
username: req.user.username || ''
|
email: req.user.email || ''
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ const utils = require('util');
|
|||||||
const bcrypt = require('bcryptjs');
|
const bcrypt = require('bcryptjs');
|
||||||
|
|
||||||
const { accounts } = require('../database/models');
|
const { accounts } = require('../database/models');
|
||||||
const generate = require('../utilities/token-generate');
|
const tokenGenerate = require('../utilities/token-generate');
|
||||||
|
|
||||||
//utilities
|
//utilities
|
||||||
const validateEmail = require('../utilities/validate-email');
|
const validateEmail = require('../utilities/validate-email');
|
||||||
@@ -48,10 +48,10 @@ const route = async (req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//generate the JWT
|
//generate the JWT
|
||||||
const tokens = generate(account.index, account.username, account.type, account.admin, account.mod);
|
const token = tokenGenerate(account.index, account.email, account.username, account.type, account.admin, account.mod);
|
||||||
|
|
||||||
//finally
|
//finally
|
||||||
res.status(200).json(tokens);
|
res.status(200).json(token);
|
||||||
};
|
};
|
||||||
|
|
||||||
const validateDetails = async (body) => {
|
const validateDetails = async (body) => {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
const destroy = require('../utilities/token-destroy');
|
const tokenDestroy = require('../utilities/token-destroy');
|
||||||
|
|
||||||
//auth/logout
|
//auth/logout
|
||||||
const route = (req, res) => {
|
const route = (req, res) => {
|
||||||
destroy(req.body.token);
|
tokenDestroy(req.body.token);
|
||||||
|
|
||||||
return res.status(200).end();
|
return res.status(200).end();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ const Op = Sequelize.Op;
|
|||||||
|
|
||||||
const { accounts, pendingSignups } = require('../database/models');
|
const { accounts, pendingSignups } = require('../database/models');
|
||||||
|
|
||||||
|
|
||||||
//utilities
|
//utilities
|
||||||
const uuid = require('../utilities/uuid');
|
const uuid = require('../utilities/uuid');
|
||||||
const validateEmail = require('../utilities/validate-email');
|
const validateEmail = require('../utilities/validate-email');
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
const jwt = require('jsonwebtoken');
|
const jwt = require('jsonwebtoken');
|
||||||
|
|
||||||
const refresh = require('../utilities/token-refresh');
|
const tokenRefresh = require('../utilities/token-refresh');
|
||||||
|
|
||||||
//auth/token
|
//auth/token
|
||||||
module.exports = async (req, res) => {
|
module.exports = async (req, res) => {
|
||||||
const refreshToken = req.body.token;
|
const refreshToken = req.body.token;
|
||||||
|
|
||||||
return refresh(refreshToken, (err, tokens) => {
|
return tokenRefresh(refreshToken, (err, token) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
return res.status(err).end();
|
return res.status(err).end();
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.status(200).send(tokens);
|
return res.status(200).send(token);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -3,5 +3,5 @@ const sequelize = require('..');
|
|||||||
|
|
||||||
module.exports = sequelize.define('tokens', {
|
module.exports = sequelize.define('tokens', {
|
||||||
token: 'varchar(320)',
|
token: 'varchar(320)',
|
||||||
username: 'varchar(320)' //TODO: why username?
|
email: 'varchar(320)'
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ const jwt = require('jsonwebtoken');
|
|||||||
const { tokens } = require('../database/models');
|
const { tokens } = require('../database/models');
|
||||||
|
|
||||||
//generates a JWT token based on the given arguments
|
//generates a JWT token based on the given arguments
|
||||||
module.exports = (index, username, type, admin, mod) => {
|
module.exports = (index, email, username, type, admin, mod) => {
|
||||||
const content = {
|
const content = {
|
||||||
index,
|
index,
|
||||||
|
email,
|
||||||
username,
|
username,
|
||||||
type,
|
type,
|
||||||
admin,
|
admin,
|
||||||
@@ -14,7 +15,7 @@ module.exports = (index, username, type, admin, mod) => {
|
|||||||
const accessToken = jwt.sign(content, process.env.SECRET_ACCESS, { expiresIn: '10m' });
|
const accessToken = jwt.sign(content, process.env.SECRET_ACCESS, { expiresIn: '10m' });
|
||||||
const refreshToken = jwt.sign(content, process.env.SECRET_REFRESH, { expiresIn: '30d' });
|
const refreshToken = jwt.sign(content, process.env.SECRET_REFRESH, { expiresIn: '30d' });
|
||||||
|
|
||||||
tokens.create({ token: refreshToken, username: username });
|
tokens.create({ token: refreshToken, email: email });
|
||||||
|
|
||||||
return { accessToken, refreshToken };
|
return { accessToken, refreshToken };
|
||||||
};
|
};
|
||||||
@@ -24,7 +24,7 @@ module.exports = (token, callback) => {
|
|||||||
return callback(403);
|
return callback(403);
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = generate(user.index, user.username, user.type, user.admin, user.mod);
|
const result = generate(user.index, user.email, user.username, user.type, user.admin, user.mod);
|
||||||
|
|
||||||
destroy(token);
|
destroy(token);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE `accounts` CHANGE `id` `index` INT( 11 ) NOT NULL AUTO_INCREMENT;
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
DROP TABLE tokens;
|
||||||
Reference in New Issue
Block a user