WIP: Testando atenticação por office 365.

This commit is contained in:
Gabriel Amancio 2025-10-16 11:31:16 -03:00
parent 2366fc1eb8
commit 4e966847a4

View File

@ -3,8 +3,6 @@ require('dotenv').config();
// --- OAuth Office 365 ---
const querystring = require('querystring');
const session = require('express-session');
const express = require('express');
const multer = require('multer');
@ -433,102 +431,11 @@ app.get('/consulta-cep', async (req, res) => {
return res.json({ endereco, latitude: lat, longitude: lon, distancia: '5km +' });
} catch (err) {
console.error(err);
return res.status(500).json({ error: 'erro na consulta' });
return res.status(500).json({ error: 'Erro na consulta' });
}
});
// Configura sessão (precisa vir antes das rotas)
app.use(session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false
}));
// Middleware simples pra proteger rotas
function ensureAuthenticated(req, res, next) {
if (req.session.user) return next();
return res.redirect('/login');
}
// === LOGIN COM OFFICE 365 ===
// Inicia o login (redireciona pro Microsoft)
app.get('/login', (req, res) => {
const authUrl = new URL(`https://login.microsoftonline.com/${process.env.OAUTH_TENANT_ID}/oauth2/v2.0/authorize`);
authUrl.search = new URLSearchParams({
client_id: process.env.OAUTH_CLIENT_ID,
response_type: 'code',
redirect_uri: process.env.OAUTH_REDIRECT_URI,
response_mode: 'query',
scope: process.env.OAUTH_SCOPES,
state: '12345'
}).toString();
res.redirect(authUrl);
app.listen(PORT, () => {
console.log(`Servidor rodando na porta ${PORT}`);
});
// Callback chamado pela Microsoft após login
app.get('/auth/callback', async (req, res) => {
const code = req.query.code;
if (!code) return res.status(400).send('Código de autorização não encontrado.');
try {
// Troca o código pelo token
const tokenUrl = `https://login.microsoftonline.com/${process.env.OAUTH_TENANT_ID}/oauth2/v2.0/token`;
const body = querystring.stringify({
client_id: process.env.OAUTH_CLIENT_ID,
scope: process.env.OAUTH_SCOPES,
code,
redirect_uri: process.env.OAUTH_REDIRECT_URI,
grant_type: 'authorization_code',
client_secret: process.env.OAUTH_CLIENT_SECRET
});
const tokenResponse = await axios.post(tokenUrl, body, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
const accessToken = tokenResponse.data.access_token;
// Busca dados do usuário logado (Graph API)
const userResponse = await axios.get('https://graph.microsoft.com/v1.0/me', {
headers: { Authorization: `Bearer ${accessToken}` }
});
// Guarda usuário e token na sessão
req.session.user = userResponse.data;
req.session.accessToken = accessToken;
console.log('Usuário logado:', userResponse.data);
// Redireciona para a página principal autenticada
res.redirect('/home');
} catch (error) {
console.error('Erro no login OAuth:', error.response?.data || error.message);
res.status(500).send('Erro ao autenticar com Office 365.');
}
});
// Página protegida (somente logados)
app.get('/home', ensureAuthenticated, (req, res) => {
const user = req.session.user;
res.send(`
<h1>Bem-vindo, ${user.displayName}!</h1>
<p>Email: ${user.mail || user.userPrincipalName}</p>
<a href="/logout">Sair</a>
`);
});
// Logout (remove sessão)
app.get('/logout', (req, res) => {
req.session.destroy(() => {
res.redirect('/');
});
});
// Inicia o servidor
app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`));