@ownid/azure-b2c
Version:
Server-side library for integrating OwnID passwordless authentication with Azure Active Directory B2C
114 lines (113 loc) • 4.43 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createOwnIdAzureB2CRouter = createOwnIdAzureB2CRouter;
const express_1 = __importDefault(require("express"));
const auth_1 = require("../core/auth");
const user_service_1 = require("../core/user-service");
/**
* Creates an Express Router with endpoints for OwnID-Azure B2C integration
*
* @param config - OwnID Azure B2C configuration
* @returns Express Router with OwnID endpoints
*/
function createOwnIdAzureB2CRouter(config) {
const router = express_1.default.Router();
const auth = new auth_1.OwnIDB2CAuth(config);
const userService = new user_service_1.OwnIDB2CUserService(auth);
// Set OwnID data for a user
router.post('/setOwnIDDataByLoginId', async (req, res) => {
try {
// Verify the OwnID request signature
try {
auth.verifyOwnIdRequest(req.body, req.headers);
}
catch (verificationError) {
return res.status(401).json({ error: verificationError.message });
}
const { loginId: email, ownIdData } = req.body;
const user = await userService.findUserByEmail(email);
if (!user) {
return res.status(404).json({ error: 'User not found' });
}
await userService.setOwnIdData(user.id, ownIdData);
return res.sendStatus(204);
}
catch (error) {
return res.status(500).json({
error: 'Internal server error',
details: error.message
});
}
});
// Get OwnID data for a user
router.post('/getOwnIDDataByLoginId', async (req, res) => {
try {
// Verify the OwnID request signature
try {
auth.verifyOwnIdRequest(req.body, req.headers);
}
catch (verificationError) {
return res.status(401).json({ error: verificationError.message });
}
const { loginId: email } = req.body;
const user = await userService.findUserByEmail(email);
if (!user) {
return res.json({ errorCode: 404 });
}
const userData = await userService.getOwnIdData(user.id);
return res.json({ ownIdData: userData.ownIdData || null });
}
catch (error) {
return res.status(500).json({
error: 'Internal server error',
details: error.message
});
}
});
// Generate session tokens for a user
router.post('/getSessionByLoginId', async (req, res) => {
try {
// Verify the OwnID request signature
try {
auth.verifyOwnIdRequest(req.body, req.headers);
}
catch (verificationError) {
return res.status(401).json({ error: verificationError.message });
}
const { loginId: email } = req.body;
const user = await userService.findUserByEmail(email);
if (!user) {
return res.status(404).json({ error: 'User not found' });
}
try {
// If a custom session generator is provided, use it
if (config.customSessionGenerator) {
const userData = await userService.getOwnIdData(user.id);
const customToken = await config.customSessionGenerator(user.id, email, userData);
return res.json(customToken);
}
else {
// Otherwise, use the default token generator
const tokenResponse = await userService.getTokens(user.id, email);
return res.json(tokenResponse);
}
}
catch (tokenError) {
return res.status(500).json({
error: 'Error acquiring authentication tokens',
details: tokenError.message
});
}
}
catch (error) {
return res.status(500).json({
error: 'Internal server error',
details: error.message
});
}
});
return router;
}