在Ubuntu系统中,使用JavaScript实现用户认证和授权通常涉及以下几个步骤:
选择框架:首先,你需要选择一个适合的Node.js框架来帮助你处理HTTP请求和业务逻辑。Express.js是最流行的Node.js框架之一,它简单、灵活,非常适合快速开发API。
设置项目:创建一个新的Node.js项目,并安装必要的依赖项,如Express.js、Passport.js(用于认证)、jsonwebtoken(用于生成和验证JWT令牌)等。
mkdir my-auth-app
cd my-auth-app
npm init -y
npm install express passport passport-local jsonwebtoken bcryptjs
配置Passport:使用Passport.js和本地策略来设置用户认证。
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcryptjs');
// 假设我们有一个用户模型
const User = require('./models/user');
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
bcrypt.compare(password, user.password, function(err, res) {
if (res) { return done(null, user); }
return done(null, false);
});
});
}
));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
实现注册和登录路由:创建注册和登录的API端点。
const express = require('express');
const router = express.Router();
// 注册路由
router.post('/register', function(req, res) {
const { username, password } = req.body;
const hashedPassword = bcrypt.hashSync(password, 8);
const newUser = new User({ username, password: hashedPassword });
newUser.save(function(err) {
if (err) throw err;
res.status(200).send('User created');
});
});
// 登录路由
router.post('/login', passport.authenticate('local'), function(req, res) {
const token = jwt.sign({ id: req.user.id }, 'your_jwt_secret', { expiresIn: '1h' });
res.json({ token: token });
});
保护路由:使用中间件来保护需要认证的路由。
const jwt = require('jsonwebtoken');
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (token == null) return res.sendStatus(401);
jwt.verify(token, 'your_jwt_secret', (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
// 受保护的路由
router.get('/protected', authenticateToken, function(req, res) {
res.json({ message: 'This is a protected route' });
});
启动服务器:最后,启动你的Express服务器。
const app = express();
app.use(express.json());
app.use(passport.initialize());
app.use('/auth', router);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
请注意,这里的代码只是一个基本的示例,实际应用中你需要考虑更多的安全性措施,比如HTTPS、CORS配置、输入验证、错误处理等。此外,用户数据应该存储在数据库中,这里为了简化示例,没有展示数据库操作。在实际应用中,你可能会使用MongoDB、MySQL或其他数据库,并使用ORM如Mongoose或Sequelize来与数据库交互。