Сбой рабочего процесса Google Cloud Identity Platform (CICP) SAML - PullRequest
1 голос
/ 05 февраля 2020

Фон

Использование Firebase Auth и провайдера аутентификации SAML со следующей конфигурацией:

const config = {
    apiKey: "AIzaSy...",
    authDomain: "example-app.firebaseapp.com",
};

firebase.initializeApp(config);

const provider = new firebase.auth.SAMLAuthProvider('saml.example-idp');

function saml() {
    firebase.auth().signInWithRedirect(provider)
        .then((result) => {
            console.log(result);
        })
        .catch((error) => {
            console.log(error);
        });
}

Конфигурация CICP для восходящего потока SAML имеет провайдера услуг: идентификатор нашей сущности и ACS настроен как наш CICP https://example-app.firebaseapp.com/__/auth/handler.

То, что я ожидаю, произойдет

Чтобы иметь возможность установить точку останова в signInWithRedirect() Обещании then и увидеть аутентифицированного пользователя.

Что на самом деле происходит

Поток перенаправляется на IdP, а аутентификация обрабатывается.

IdP генерирует страницу публикации перенаправления с автоматическими c submit-on-load и multipart/form-data форма с:

  • Content-Disposition: form-data; name = SAMLResponse - содержит подписанный SAMLResponse с кодировкой base64
  • Content-Disposition: form-data; name = RelayState - содержит состояние реле из потока SAML
  • Content-Disposition: form-data; name = "ssourl" - содержит URI обработчика аутентификации проекта firebase

Это, в свою очередь, заставляет CICP отображать и возвращать страницу со скриптом, который устанавливает

var POST_BODY=""------WebKitFormBoundary9bn7AOpnZiIRk9qZ\r\nContent....."

, т. е. вместо Анализируя тело формы и извлекая поле SAMLResponse, он воспроизводит весь Request.body в сценарий, а затем вызывает fireauth.oauthhelper.widget.initialize();

Это, очевидно, завершается ошибкой, потому что это циклически обрабатывает, а затем пытается отправить все тело ответа на /__/auth/handler конечная точка в виде строки запроса.

Я подозреваю, что в этой цепочке отсутствует простой элемент конфигурации, потому что все потоки выглядят нормально для меня, пока данные многочастной формы не будут помещены в POST_BODY, а затем предотвратят преобразование токена SAML в OAuth. token.

Вопрос

Какой элемент конфигурации является неправильным в этой (отредактированной) настройке и каков правильный вывод значения для его замены?

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Короткий ответ на длинный вопрос:

Обработка поставщика SAML в Firebase Auth и Google CICP не обрабатывает multipart/form-data и должна быть в application/x-www-form-urlencoded.

Это конфигурация SAML IdP, а не то, что может быть обработано конфигурацией поставщика услуг Firebase Auth.

0 голосов
/ 06 февраля 2020

Возможно, есть и дополнительная техническая проблема с SAML, но, по крайней мере, в способе использования sign-in есть точка несогласованности.

Согласно (Официальные документы) [https://cloud.google.com/identity-platform/docs/how-to-enable-application-for-saml#handle -signin-with-client-sdk] , у вас есть 2 варианта входа:

1) с помощью всплывающего окна

В этом случае вы можете использовать обещание для получения user credential с помощью sign-in метода:

firebase.auth().signInWithPopup(provider)
    .then((result) => {
      // User is signed in.
      // Identity provider data available in result.additionalUserInfo.profile,
      // or from the user's ID token obtained via result.user.getIdToken()
      // as an object in the firebase.sign_in_attributes custom claim
      // This is also available via result.user.getIdTokenResult()
      // idTokenResult.claims.firebase.sign_in_attributes.
    })
    .catch((error) => {
      // Handle error.
    });

2) с помощью перенаправления

В этом случае ваш код должен быть разбит на 2 части. Первый метод sign-in, без использования каких-либо обещаний:

 firebase.auth().signInWithRedirect(provider);

Затем инициализация «слушателя» для получения учетных данных пользователя после перенаправления входа:

// On return.
firebase.auth().getRedirectResult()
    .then((result) => {
      // User is signed in.
      // Identity provider data available in result.additionalUserInfo.profile,
      // or from the user's ID token obtained via result.user.getIdToken()
      // as an object in the firebase.sign_in_attributes custom claim
      // This is also available via result.user.getIdTokenResult()
      // idTokenResult.claims.firebase.sign_in_attributes.
    })
    .catch((error) => {
      // Handle error.
    });  

Для добавления в bootstrap часть вашей страницы / приложения.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...