Passport 是 Node.js 中的一个简单的、灵活的中间件,用于 authentication 和 authorization。它可以工作在任何 Express.js 或 Connect 兼容的 web 应用中。
以下是 Passport 的一些常见用法:
- 使用 Passport 进行本地认证
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
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, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
- 使用 Passport 进行Twitter认证
var passport = require('passport');
var TwitterStrategy = require('passport-twitter').Strategy;
passport.use(new TwitterStrategy({
consumerKey: TWITTER_CONSUMER_KEY,
consumerSecret: TWITTER_CONSUMER_SECRET,
callbackURL: "http://localhost:3000/auth/twitter/callback"
},
function(token, tokenSecret, profile, done) {
// 在这里可以查询用户是否在数据库中存在,如果不存在就创建一个新用户
User.findOrCreate({ twitterId: profile.id }, function (err, user) {
if (err) { return done(err); }
done(null, user);
});
}
));
- 使用 Passport 序列化和反序列化用户
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
- 使用 Passport 初始化
app.use(session({ secret: 'your secret', resave: false, saveUninitialized: true })); // 使用session中间件
app.use(passport.initialize());
app.use(passport.session()); // 使用passport的session中间件
- 使用 Passport 定义路由
app.get('/auth/twitter', passport.authenticate('twitter'));
app.get('/auth/twitter/callback',
passport.authenticate('twitter', { failureRedirect: '/login' }),
function(req, res) {
// 登陆成功后要执行的操作
res.redirect('/');
});
以上代码都是 Passport 的常用示例,展示了如何使用 Passport 进行本地认证、Twitter 认证以及用户的序列化和反序列化。在实际应用中,开发者可以根据自己的需求选择合适的认证策略,并结合 Passport 使用。