4

我正在使用 GSuite 的 express 和 passport-saml 使用 nodejs 实现基于 SAML 的 SSO。我可以配置第一部分并让 passport-saml 将我重定向到谷歌登录页面。但是我对 gsuite 要求我完成配置的 ACS url 和身份 ID 感到困惑。因此,当我在谷歌登录页面上登录时,我最终得到了来自谷歌的 503。我想我有点理解 SAML 的工作原理,但我是第一次使用它,所以我可能完全错了。

经过大量研究,我遇到了这个答案,但我不确定我是否理解得很好。它说我可以使用为护照path和参数设置的相同网址callback

这是我的护照配置的样子:

 passport.use(                                                                                                                                                                                                                           
  new SamlStrategy(                                                                                                                                                                                                                        
    {                                                                                                                                                                                                                                      
      protocol: "https://",                                                                                                                                                                                                                 
      path: "/auth/saml/callback",                                                                                                                                                                                    
      entryPoint: "https://accounts.google.com/o/saml2/idp?idpid=XXXXXX",                                                                                                                                                               
      issuer: "https://accounts.google.com/o/saml2?idpid=XXXXXX",                                                                                                                                                                       
      cert: fs                                                                                                                                                                                                                             
        .readFileSync("./cert.pem", "utf-8")                                                                                                                                                                                               
        .replace("-----BEGIN CERTIFICATE-----", "")                                                                                                                                                                                        
        .replace("-----END CERTIFICATE-----", "")                                                                                                                                                                                          
        .replace(/\n$/, "")                                                                                                                                                                                                                
    },                                                                                                                                                                                                                                     
    function(profile, done) {                                                                                                                                                                                                                                                                                                                                                                                                                     
      done(null, {                                                                                                                                                                                                                         
        email: profile.email,                                                                                                                                                                                                              
        name: profile.name                                                                                                                                                                                                                 
      });                                                                                                                                                                                                                                  
    }                                                                                                                                                                                                                                      
  )                                                                                                                                                                                                                                        
);      

在这里我的护照相关路线是如何配置的:

app.post(
  "/auth/saml/callback",
  passport.authenticate("saml", {
    failureRedirect: "/error",
    failureFlash: true
  }),
  function(req, res) {
    res.redirect("/logged");
  }
);

app.get(
  "/login/saml",
  passport.authenticate("saml", {
    failureRedirect: "/login/saml"
  }),
  function(req, res) {
    res.redirect("/");
  }
);

/login/saml是我用来调度我想与护照一起使用的配置的路线,因为我正在使用MultiSamlStrategy,我没有故意把它放在护照中。

有人可以解释一下我需要为 Gsuite 中的 ACS url 和 Entity ID 设置什么吗?我认为了解 ACS url 必须返回带有我的服务信息的 XML,但我不明白如何生成它。

谢谢

4

1 回答 1

2

向 IdP ( GSuite entityID) 标识 SP(您的应用程序)。通常 IdP 使用entityID来查找 SP 的 SAML 元数据。属性消费者服务 ( ACS) URL 将在 SP 的元数据中。这就是它应该如何工作的方式。您通常不能给 IdPACS并取回 SAML Response,因为它是一个安全漏洞。我没有使用 GSuite IdP,但我想你告诉配置ACSurl?

护照文档中,entryPoint是 IdP 的登录端点。IdP 已经知道它的 entityID,因此您不需要它:

entryPoint: "https://accounts.google.com/o/saml2/idp

发行人是您的entityID去向:

issuer: "YOUR_ENTITYID"

根据您的配置,您的 ACS 是:

"/auth/saml/callback"

所以你需要路线:

app.post('/auth/saml/callback',
  bodyParser.urlencoded({ extended: false }),
  passport.authenticate('saml', { failureRedirect: '/', failureFlash: true }),
  function(req, res) {
    res.redirect('/');
  }
);

记住那issuer是你的entityID

所以总结一下:

有人可以解释一下我需要为 Gsuite 中的 ACS url 和实体 ID 设置什么吗?ACS url 是完全限定的 url:

/auth/saml/callback

entityID( issuer) 是您在元数据中所称的任何内容。一般是URI这样的:

https://your.app/saml/sp
于 2019-04-26T10:07:18.997 回答