Генерация URL ACS с экспресс-паролем и saml для Gsuite SSO - PullRequest
4 голосов
/ 19 апреля 2019

Я реализую единый вход на основе SAML с nodejs, используя express и passport-saml для GSuite.Я могу настроить первую часть и получить passport-saml, чтобы перенаправить меня на страницу входа в Google.Но я застрял в отношении URL-адреса ACS и идентификатора, который gsuite попросил меня завершить настройку.Поэтому, когда я захожу на страницу входа в Google, я получаю 503 от Google.Я думаю, что вроде понимаю, как работает SAML, но я работаю с ним впервые, поэтому я могу быть совершенно неправ.

После долгих исследований я наткнулся на этот ответ , но я не уверен, что понимаю его хорошо.Он говорит, что я могу использовать те же URL-адреса, которые я установил для параметров 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, я не сделалпреднамеренно положить его в паспорт.

Может кто-нибудь объяснить мне, что мне нужно установить для URL-адреса ACS и идентификатора сущности в Gsuite?Я думаю, что понял, что URL ACS должен возвращать XML с моей служебной информацией, но я не могу понять, как его сгенерировать.

Спасибо

1 Ответ

0 голосов
/ 26 апреля 2019

entityID идентифицирует SP (ваше приложение) для IdP (GSuite). Обычно IdP использует entityID для поиска метаданных SAML SP. URL службы поддержки атрибутов (ACS) будет в метаданных SP. Вот как это должно работать. Как правило, вы не можете дать IdP ACS и вернуть SAML Response, поскольку это дыра в безопасности. Я не использовал GSuite IdP, но полагаю, что вы указали конфигурацию ACS url?

Из документов для паспорта , 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.

Итак, подведем итог:

Может кто-нибудь объяснить мне, что мне нужно установить для URL ACS и Идентификатор объекта в Gsuite? URL ACS - это полный URL-адрес:

/auth/saml/callback

и entityID (issuer) - это то, что вы назвали в своих метаданных. Обычно это URI, например:

https://your.app/saml/sp
...