UNPKG

faceit-visa

Version:

A lightweight OAuth2 authentication library for FACEIT integration

142 lines 5.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FaceitVisaMiddleware = void 0; const express_1 = require("express"); class FaceitVisaMiddleware { constructor(visa, options = {}) { this.visa = visa; this.options = { loginPath: '/auth/faceit', callbackPath: '/auth/faceit/callback', ...options }; } /** * Create authentication routes */ getRoutes() { const router = (0, express_1.Router)(); // Login route router.get(this.options.loginPath, (req, res) => { const { url, codeVerifier } = this.visa.getAuthUrl(); // Store codeVerifier in session (like your original code) if (req.session) { req.session.codeVerifier = codeVerifier; } return res.redirect(url); }); // Callback route router.get(this.options.callbackPath, async (req, res) => { const { code } = req.query; if (!code || typeof code !== 'string') { return this.handleError(req, res, 'no_code'); } // Get codeVerifier from session (like your original code) const codeVerifier = req.session ? req.session.codeVerifier : null; if (!codeVerifier) { return this.handleError(req, res, 'no_codeverifier'); } try { // Exchange code for token const tokenResponse = await this.visa.exchangeCode(code, codeVerifier); if (!tokenResponse) { return this.handleError(req, res, 'token_exchange_failed'); } // Get user profile const user = await this.visa.getUserProfile(tokenResponse.access_token); if (!user) { return this.handleError(req, res, 'user_profile_failed'); } // Clean up code verifier from session if (req.session) { delete req.session.codeVerifier; } // Store user in session if (req.session) { req.session.user = user; req.session.faceitToken = tokenResponse; } // Add to request req.user = user; req.faceitToken = tokenResponse; if (this.options.onSuccess) { this.options.onSuccess(req, res); } else { res.json({ success: true, user }); } } catch (error) { console.error('FaceitVisa Middleware: Callback error:', error); return this.handleError(req, res, 'internal_error'); } }); return router; } /** * Middleware to require authentication */ requireAuth() { return (req, res, next) => { const authReq = req; // Check session first if (req.session && req.session.user) { authReq.user = req.session.user; authReq.faceitToken = req.session.faceitToken; return next(); } // Not authenticated res.status(401).json({ error: 'unauthorized', message: 'Authentication required', loginUrl: this.options.loginPath }); }; } /** * Optional authentication middleware */ optionalAuth() { return (req, res, next) => { const authReq = req; if (req.session && req.session.user) { authReq.user = req.session.user; authReq.faceitToken = req.session.faceitToken; } next(); }; } /** * Logout middleware */ logout() { return (req, res) => { if (req.session) { delete req.session.user; delete req.session.faceitToken; } res.json({ success: true, message: 'Logged out successfully' }); }; } handleError(req, res, error) { if (this.options.onError) { this.options.onError(req, res, error); } else { const messages = { no_code: 'Authorization code not provided', no_codeverifier: 'Login session expired, try again', token_exchange_failed: 'Failed to exchange authorization code', user_profile_failed: 'Failed to fetch user profile', internal_error: 'Internal server error' }; res.status(400).json({ error, message: messages[error] || 'Unknown error' }); } } } exports.FaceitVisaMiddleware = FaceitVisaMiddleware; exports.default = FaceitVisaMiddleware; //# sourceMappingURL=middleware.js.map