nodefony
Version:
Nodefony Framework Core
211 lines (202 loc) • 6.08 kB
JavaScript
/**
* @Route ("/api/jwt")
*/
class loginApiController extends nodefony.Controller {
constructor (container, context) {
super(container, context);
this.security = this.get("security");
this.jwtFactory = this.security.getFactory("jwt");
this.jwtSettings = this.bundle.settings.jwt;
this.usersService = this.get("users");
// JSON API
this.api = new nodefony.api.OpenApi({
name: "login-api",
version: this.bundle.version,
description: "Nodefony Login Api",
basePath: "/api/jwt"
}, this.context);
}
/**
* @Method ({"GET"})
* @Route (
* "/documentation",
* name="api-login-doc"
* )
* @Firewall ({bypass:true})
*/
swaggerAction () {
return this.optionsAction();
}
/**
* @Method ({"OPTIONS"})
* @Route ( "",name="api-login-options",)
*/
optionsAction () {
try {
const openApiConfig = require(path.resolve(this.bundle.path, "Resources", "swagger", "openapi", "login.js"));
return this.api.renderSchema(openApiConfig, this.usersService.entity);
} catch (e) {
return this.api.renderError(e, 400);
}
}
/**
* @Method ({"POST"})
* @Route (
* "/login",
* name="api-login-jwt"
* )
*/
async loginAction () {
if (!this.context.token) {
return this.createException("No Auth Token", 401);
}
try {
if (!this.context.token.user.enabled) {
const error = new Error(`User : ${this.context.token.user.username} disabled`);
throw this.createSecurityException(error);
}
const token = this.jwtFactory.generateJwtToken(
this.context.token.serialize(),
this.jwtSettings.token
);
const refreshToken = await this.jwtFactory.generateJwtRefreshToken(
this.context.token.user.username,
token,
this.jwtSettings.refreshToken
);
return this.api.render({
decodedToken: this.jwtFactory.decodeJwtToken(token),
token,
refreshToken
});
} catch (e) {
throw this.createException(e, 401);
}
}
/**
* @Method ({"POST"})
* @Route (
* "/token",
* name="api-login-jwt-token"
* )
* @Firewall ({bypass:true})
*/
async tokenAction () {
try {
// get refreshToken from request
let sessionToken = null;
let refreshToken = null;
// for statefull
if (this.session) {
sessionToken = this.session.get("refreshToken");
}
refreshToken = this.request.headers.refreshtoken || this.query.refreshToken || sessionToken;
if (!refreshToken) {
throw this.createSecurityException("refreshToken parameter Not found");
}
// verify refreshToken expired
const refresh = await this.jwtFactory.verifyRefreshToken(refreshToken)
.catch((e) => {
throw this.createSecurityException(e);
});
const {username} = refresh.data;
if (!username) {
throw this.createSecurityException("username not valid");
}
const dtuser = await this.usersService.findOne(username);
// controll user enabled
if (dtuser && dtuser.enabled) {
// generate new token access
const token = this.jwtFactory.generateJwtToken({
user: dtuser
}, this.jwtSettings.token);
await this.jwtFactory.updateJwtRefreshToken(dtuser.username, token, refreshToken);
return this.api.render({
decodedToken: this.jwtFactory.decodeJwtToken(token),
token
});
}
throw this.createSecurityException("User not valid");
} catch (e) {
throw this.createException(e);
}
}
/**
* @Method ({"POST"})
* @Route (
* "/refresh",
* name="api-login-jwt-refresh"
* )
*/
async refreshAction () {
// get refreshToken from request
let sessionToken = null;
let sessionRefreshToken = null;
let refreshToken = null;
let token = null;
// for statefull
if (this.session) {
sessionToken = this.session.get("token");
sessionRefreshToken = this.session.get("refreshToken");
}
refreshToken = this.request.headers.refreshtoken || this.query.refreshToken || sessionRefreshToken;
token = this.request.headers.jwt || this.query.token || sessionToken;
if (!refreshToken || !token) {
throw this.createSecurityException("refreshToken or token parameter Not found");
}
// verify refreshToken expired
const refresh = await this.jwtFactory.verifyRefreshToken(refreshToken)
.catch((e) => {
throw this.createSecurityException(e);
});
const {username} = refresh.data;
if (!username) {
throw this.createSecurityException("username not valid");
}
const dtuser = await this.usersService.findOne(username);
// controll user enabled
if (dtuser && dtuser.enabled) {
await this.jwtFactory.truncateJwtToken(this.context.token.user.username);
const refreshToken = await this.jwtFactory.generateJwtRefreshToken(
this.context.token.user.username,
token,
this.jwtSettings.refreshToken
);
return this.api.render({
decodedToken: this.jwtFactory.decodeJwtToken(token),
token,
refreshToken
});
}
throw this.createSecurityException("User not valid");
}
/**
* @Method ({"POST"})
* @Route (
* "/token/truncate",
* name="api-login-jwt-truncate"
* )
*/
async truncateAction () {
try {
const res = await this.jwtFactory.truncateJwtToken(this.query.username);
return this.api.render({
nbDeleted: res
});
} catch (e) {
throw this.api.renderError(e, 401);
}
}
/**
* @Method ({"POST"})
* @Route ("/logout", name="api-login-jwt-logout")
*/
logoutAction () {
return this.logout()
.then(() => this.api.render({
logout: "ok"
}))
.catch((e) => this.api.render(e, 500));
}
}
module.exports = loginApiController;