在Node.js中实现单点登录(SSO)可以使用session或JWT(Json Web Tokens)。以下是使用Express框架实现的示例代码:
使用Session的SSO:
const express = require('express');
const session = require('express-session');
const app = express();
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));
app.post('/login', (req, res) => {
// 验证用户凭据
if (validCredentials) {
req.session.user = { id: 'user_id', name: 'username' };
res.redirect('/');
} else {
res.status(401).send('Invalid credentials');
}
});
app.get('/logout', (req, res) => {
req.session.destroy(() => {
res.redirect('/');
});
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
使用JWT的SSO:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.post('/login', (req, res) => {
// 验证用户凭据
if (validCredentials) {
const token = jwt.sign({ id: 'user_id', name: 'username' }, 'your_secret_key', { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).send('Invalid credentials');
}
});
app.get('/protected', (req, res) => {
const token = req.headers.authorization;
if (token) {
jwt.verify(token, 'your_secret_key', (err, decoded) => {
if (err) {
res.status(401).send('Invalid token');
} else {
res.send(`Welcome ${decoded.name}`);
}
});
} else {
res.status(401).send('No token provided');
}
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
CORS支持:
const cors = require('cors');
// 允许来自所有域的请求,在生产环境中应更严格设置
const corsOptions = {
origin: '*'
};
app.use(cors(corsOptions));
以上代码提供了使用session和JWT的SSO示例,并展示了如何设置CORS以允许跨域请求。在实际应用中,你需要更详细地实现用户凭证验证、安全性考虑(例如HTTPS、CSRF保护等)以及更复杂的权限管理。