为Gsuite SSO生成带有Express和Passport-Saml的ACS网址

时间:2019-04-19 15:34:01

标签: node.js express saml-2.0 gsuite passport-saml

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

经过大量研究,我发现了这个answer,但不确定自己是否理解得很好。它说我可以使用为护照的pathcallback参数设置的相同网址

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

 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网址和实体ID设置什么吗?我认为可以理解,ACS URL必须返回带有我的服务信息的XML,但是我不知道如何生成它。

谢谢

1 个答案:

答案 0 :(得分:0)

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

passport docs中,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

总结一下:

  

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

/auth/saml/callback

entityIDissuer)就是您在元数据中所说的。通常是URI,例如:

https://your.app/saml/sp