faceit-visa
Version:
A lightweight OAuth2 authentication library for FACEIT integration
142 lines • 5.02 kB
JavaScript
"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