faceit-visa
Version:
A lightweight OAuth2 authentication library for FACEIT integration
139 lines • 5.16 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FaceitVisaMiddleware = exports.FaceitVisa = void 0;
const crypto_1 = require("crypto");
const axios_1 = __importDefault(require("axios"));
const qs = __importStar(require("qs"));
class FaceitVisa {
constructor(config) {
this.codeVerifierStore = new Map();
this.config = {
apiEnv: 'https://api.faceit.com',
accountEnv: 'https://accounts.faceit.com',
...config
};
}
/**
* Generate authorization URL for OAuth2 flow
*/
getAuthUrl(sessionId) {
const codeVerifier = this.base64URLEncode((0, crypto_1.randomBytes)(32));
const codeChallenge = this.base64URLEncode((0, crypto_1.createHash)('sha256').update(codeVerifier).digest());
if (sessionId) {
this.codeVerifierStore.set(sessionId, codeVerifier);
}
const params = new URLSearchParams({
redirect_popup: 'true',
response_type: 'code',
client_id: this.config.clientId,
code_challenge: codeChallenge,
code_challenge_method: 'S256',
redirect_uri: this.config.redirectUri
});
const url = `${this.config.accountEnv}/accounts?${params.toString()}`;
return { url, codeVerifier };
}
/**
* Exchange authorization code for access token
*/
async exchangeCode(code, codeVerifier) {
try {
const response = await axios_1.default.post(`${this.config.apiEnv}/auth/v1/oauth/token`, qs.stringify({
grant_type: 'authorization_code',
code: code,
code_verifier: codeVerifier,
code_challenge_method: 'S256'
}), {
headers: {
'Authorization': `Basic ${this.base64Encode(`${this.config.clientId}:${this.config.clientSecret}`)}`,
'Content-Type': 'application/x-www-form-urlencoded'
}
});
return response.data;
}
catch (error) {
console.error('FaceitVisa: Token exchange failed:', error?.response?.data || error.message);
return null;
}
}
/**
* Get user profile using access token
*/
async getUserProfile(accessToken) {
try {
const response = await axios_1.default.get(`${this.config.apiEnv}/auth/v1/resources/userinfo`, {
headers: {
'Authorization': `Bearer ${accessToken}`
}
});
return response.data;
}
catch (error) {
console.error('FaceitVisa: User profile fetch failed:', error?.response?.data || error.message);
return null;
}
}
/**
* Get code verifier by session ID
*/
getCodeVerifier(sessionId) {
return this.codeVerifierStore.get(sessionId);
}
/**
* Remove code verifier after use
*/
clearCodeVerifier(sessionId) {
this.codeVerifierStore.delete(sessionId);
}
base64URLEncode(buffer) {
return buffer.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
base64Encode(str) {
return Buffer.from(str).toString('base64');
}
}
exports.FaceitVisa = FaceitVisa;
// Re-export middleware
var middleware_1 = require("./middleware");
Object.defineProperty(exports, "FaceitVisaMiddleware", { enumerable: true, get: function () { return middleware_1.FaceitVisaMiddleware; } });
exports.default = FaceitVisa;
//# sourceMappingURL=index.js.map