UNPKG

nodefony

Version:
211 lines (202 loc) 6.08 kB
/** * @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;