Node.js 实现单点登录

文章内容总结: 本文介绍了如何在Node.js应用程序中使用OpenID Connect(OIDC)和Passport进行身份验证。首先,通过配置Passport和OIDC策略,指定身份提供者(IDP)的URL、客户端ID和密钥等信息。然后,定义回调函数来查找或创建本地用户,并在用户成功认证后返回用户信息。接着,设置passport的序列化和反序列化用户函数。最后,配置Express应用程序使用会话,并定义路由处理登录和回调请求。文章强调了使用HTTPS、安全存储客户端密钥、验证ID令牌和使用短期访问令牌的重要性。 评价: 本文提供了一个清晰的指南,展示了如何在Node.js应用中集成OpenID Connect和Passport进行身份验证。代码示例和安全实践的强调使得文章既实用又具有指导性。

结果由AI生成

使用 OpenID Connect(Passport + OIDC)

const express = require('express');
const session = require('express-session');
const passport = require('passport');
const OpenIDConnectStrategy = require('passport-openidconnect').Strategy;

passport.use('oidc', new OpenIDConnectStrategy({
  issuer: 'https://your-idp.example.com',
  authorizationURL: 'https://your-idp.example.com/auth',
  tokenURL: 'https://your-idp.example.com/token',
  userInfoURL: 'https://your-idp.example.com/userinfo',
  clientID: process.env.OIDC_CLIENT_ID,
  clientSecret: process.env.OIDC_CLIENT_SECRET,
  callbackURL: 'https://app.example.com/auth/callback',
  scope: 'openid profile email'
}, function(issuer, sub, profile, accessToken, refreshToken, done) {
  // 在这里查找或创建本地用户
  const user = { id: sub, profile, accessToken, refreshToken };
  return done(null, user);
}));

passport.serializeUser((u, cb) => cb(null, u));
passport.deserializeUser((u, cb) => cb(null, u));

const app = express();
app.use(session({ secret: 'replace-with-secure-secret', resave:false, saveUninitialized:false }));
app.use(passport.initialize());
app.use(passport.session());

app.get('/auth/login', passport.authenticate('oidc'));
app.get('/auth/callback', passport.authenticate('oidc', { failureRedirect: '/login' }), (req, res) => {
  res.redirect('/');
});

用 HTTPS、把 client secret 存在安全的 secret manager、验证 ID Token(签名、issuer、aud、exp)并使用短期 Access Token

2 评论
  • 1584800755
    8 月 30, 2025

    太帅了欧迪,我太爱你了,太有才华了,我要和你生猴子

  • 2218124990
    8 月 30, 2025

    打游戏就好好打游戏啊喂[

登录 之后才能评论。

回到顶部