const express = require('express');
const { query, validationResult } = require('express-validator');
const router = express.Router();
// Supported OAuth providers
const SUPPORTED_PROVIDERS = [
'google', 'github', 'facebook', 'twitter',
'linkedin', 'microsoft', 'apple', 'discord'
];
router.get('/authorize', [
query('provider').isIn(SUPPORTED_PROVIDERS),
query('redirect_to').optional().isURL(),
query('scopes').optional().isString(),
query('state').optional().isString()
], async (req, res) => {
try {
// Check validation errors
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
code: 400,
msg: 'Invalid request parameters',
details: errors.array()
});
}
const { provider, redirect_to, scopes, state } = req.query;
// Validate redirect URL against whitelist
if (redirect_to && !isWhitelistedURL(redirect_to)) {
return res.status(400).json({
code: 400,
msg: 'Invalid redirect URL',
details: 'Redirect URL must be whitelisted in your project settings'
});
}
// Build authorization URL
const authParams = new URLSearchParams({
provider,
...(redirect_to && { redirect_to }),
...(scopes && { scopes }),
...(state && { state })
});
const authURL = `${process.env.AUTH_SERVICE_URL}/authorize?${authParams}`;
// Redirect to Strike Auth Service
res.redirect(authURL);
} catch (error) {
console.error('OAuth authorization error:', error);
res.status(500).json({
code: 500,
msg: 'Internal server error',
details: 'Please try again later'
});
}
});
function isWhitelistedURL(url) {
const whitelistedDomains = process.env.WHITELISTED_DOMAINS?.split(',') || [];
try {
const urlObj = new URL(url);
return whitelistedDomains.some(domain =>
urlObj.hostname === domain || urlObj.hostname.endsWith(`.${domain}`)
);
} catch {
return false;
}
}
module.exports = router;