TodoMVC 示例项目: https://github.com/Authing/todos-express-openidconnect
配置
npm install --save passport passport-openidconnect
参考示例项目的 routes/auth.js
:
// FIXME: 修改配置,保持与 Authing 控制台中配置一致
passport.use(new OpenIDConnectStrategy({
// 将二级域名前缀 passport-authing 改为你自己的应用域名
issuer: 'https://passport-authing.authing.cn/oidc',
authorizationURL: 'https://passport-authing.authing.cn/oidc/auth',
tokenURL: 'https://passport-authing.authing.cn/oidc/token',
userInfoURL: 'https://passport-authing.authing.cn/oidc/me',
// 可以将 App ID 和 App Secret 放到 .env 文件中或环境变量中
clientID: '6205d4e5dd728952be979ca1',
clientSecret: 'eb578704fdc0273dd78d4ea38995ea27',
// 这里忽略了域名, Authing 控制台中需要配置完整的 URL
callbackURL: '/oauth2/redirect',
scope: [ 'profile' ],
state: true
},
function verify(issuer, profile, cb) {
// 可以在此处校验用户是否存在并插入到你的应用数据库中
return cb(null, profile);
}));
参考示例项目的 app.js
:
// FIXME: Passport 会话存储在 Session 中,可以替换其他
app.use(passport.authenticate('session'));
参考示例项目的 routes/auth.js
:
router.get('/login', passport.authenticate('openidconnect'));
router.get('/oauth2/redirect', passport.authenticate('openidconnect', {
successReturnToOrRedirect: '/',
failureRedirect: '/login'
}));
router.post('/logout', function(req, res, next) {
req.logout();
// 注意这里是 SSO 退出所有应用,如果没有需要,可以直接返回 `/`
res.redirect('https://passport-authing.authing.cn/login/profile/logout?redirect_uri=' + encodeURIComponent('http://localhost:3000/'));
});
可以根据你的数据库字段做匹配的序列化操作:
passport.serializeUser(function(user, cb) {
process.nextTick(function() {
// 详细字段参考: https://docs.authing.cn/v2/guides/user/user-profile.html
cb(null, { id: user.id, username: user.username, name: user.nickname });
});
});
passport.deserializeUser(function(user, cb) {
process.nextTick(function() {
return cb(null, user);
});
});
详细用户字段参考: 用户字段释义 | Authing 文档
npm start