passport是Node中身份认证中间件,通过不同的策略(strategy)插件完成不同协议的认证,很大程度上简化了认证的过程。文章中使用了oauth2.0身份验证策略。
安装
> $ npm install passport
> $ npm install passport-oauth2
使用
app.js
var express = require('express');
var app = express();
var passport = require('passport');
var OAuth2Strategy = require('passport-oauth2');
passport.use('provider', new OAuth2Strategy({
authorizationURL: 'https://xxx.oauth2.0/authorize',
tokenURL: 'https://xxx./oauth2.0/token',
clientID: 'xxxxxx',
clientSecret: 'xxxxxxxx',
callbackURL: `auth/callback`
},
function (accessToken, refreshToken, profile, done) {
User.find(accessToken, () => {
// 保存用户信息
done(error, data);
})
}
));
// 为了以后使用,将用户数据序列化之后存到到session中
passport.serializeUser(function (user, done) {
done(null, user);
});
// 反序列化
passport.deserializeUser(function (user, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
// 路由
// 在connect风格程序中需要初始化
app.use(passport.initialize());
// 持久化
app.use(passport.session());
// 用于重定向到provider, http://localhost:4200/auth/provider
app.get('/auth/provider', passport.authenticate('provider'));
// 认证之后结果的回调函数
app.get('/auth/provider/callback',
passport.authenticate('provider', { successRedirect: '/',
failureRedirect: '/login' }));
常见问题
InternalOAuthError: Failed to obtain access token
修改oauth2.0配置地址协议类型为https
Resolve error: passport.initialize() middleware not in use
添加 server.use(passport.initialize());
Failed to serialize user into session
// 代码中添加
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function (user, done) {
done(null, user);
});
TokenError at OAuth2Strategy.parseErrorResponse
检查token是否已失效