使用 Passport OpenIdConnect 连接 Authing

TodoMVC 示例项目: https://github.com/Authing/todos-express-openidconnect

配置

  1. 安装依赖

npm install --save passport passport-openidconnect
  1. 配置 Passport

参考示例项目的 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);
}));
  1. 配置会话

参考示例项目的 app.js

// FIXME: Passport 会话存储在 Session 中,可以替换其他
app.use(passport.authenticate('session'));
  1. 配置路由

参考示例项目的 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/'));
});
  1. 可选:序列化用户数据

可以根据你的数据库字段做匹配的序列化操作:

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 文档

  1. 运行

npm start

参考资料