Node express 与 OpenID 连接

Ray*_*n D 7 openid node.js oauth-2.0 express openid-connect

我使用这个oidc与 nodejs一起使用

我需要的是以下内容:

  1. 用户使用用户密码登录,或者让数据已经在会话 cookie 中。这是调用我的应用程序根路由"/"

  2. 我已经在 中注册了应用程序authorisation server,身份验证服务器应该调用我的app/redirect

  3. 我从身份验证服务器获取了clientId 和客户端机密并将其放入应用程序中。

  4. 当用户登录时,身份验证服务器应调用我的应用程序重定向路由。

  5. oidc策略,我需要得到的tokenset.claims();,并从它tokenset.id_token用户令牌。, 在重定向调用中

它应该与

response_type: 'code',
Run Code Online (Sandbox Code Playgroud)

https://github.com/auth0/express-openid-connect#getting-started

问题是该getUser函数被调用(而调试应用程序),但是我得到了userIdentity来自req.session.userIdentityundefined,任何想法可能是错在这里?

我们有相同的旧实现,它使用 OIDC,它适用于相同的身份验证服务器和客户端 ID 和密码。

  const { auth, requiresAuth } = require('express-openid-connect');
  const session = require('express-session');
  const bodyParser = require('body-parser');
    
    module.exports = async (app) => {
    
      const ClientId = process.env.CI;
      const ClientSecret = process.env.CS;
      const URL = process.env.S_URL;
    
      app.use(session({
         name: 'bat-auth',
         secret: 'cookie-secret',
      }));

      app.use(bodyParser.json());
      app.use(bodyParser.urlencoded({ extended: true }));
    
      app.use(auth({
          clientSecret: ClientSecret,
          issuerBaseURL: `${URL}`,
          clientID: ClientId,
          baseURL: process.env.REDT_URL,
          redirectUriPath: '/redirect',  //my app redirect route
          authorizationParams: {
           response_type: 'code',
           response_mode: 'form_post',
           scope: 'openid',
          },
        async handleCallback(req, res, next) {
           req.session.openidTokens = req.openidTokens;
           console.log('---req.openidTokens', req.openidTokens);
           req.session.userIdentity = req.openidTokens.claims();
          next();
        },
        async getUser(req) {
           return req.session.userIdentity;
        },
      }));

  app.get('/', (req, res) => {
    const tokenSet = req.openid.makeTokenSet(req.session.openidTokens);
    console.log(`tokenset root: ${tokenSet}`);

    res.send(req.isAuthenticated() ? 'Logged in' : 'Logged out');
  });
  app.get('/redirect', async (req, res) => {
    const tokenSet = req.openid.makeTokenSet(req.session.openidTokens);
    console.log(`tokenset: ${tokenSet}`);
    console.log('redirect called');
    res.send('redirect called');
  });
Run Code Online (Sandbox Code Playgroud)

我应该使用表单发布,最后,我需要的是从 tokenset, 中user.id_token

这是我已经验证过的!

  1. 来自身份验证服务器的 ClientID
  2. 来自身份验证服务器的 ClientSecret
  3. 配置身份验证服务器我的应用程序 redirect路径,它应该在成功登录后调用我
  4. 我也有aud钥匙

顺便说一句,在调试应用程序时,它不会停止添加 handleCallback 函数,但它getUser首先在应用程序上停止,不确定可能是什么原因......

gco*_*ard 1

看起来您正在尝试读取req.session.userIdentity但从未将其设置在任何地方。你正在设置req.session.openidTokens

根据示例代码,您可能需要将 handleCallback 函数修改为以下内容:

async handleCallback(req, res, next){
  req.session.openidTokens = req.openidTokens;
  console.log('---req.openidTokens', req.openidTokens);
  req.session.userIdentity = req.openidTokens.claims(); // <-- this is required to make your code sample work
  next();
}
Run Code Online (Sandbox Code Playgroud)