SAML로 사용자 로그인

이 도움말에서는 Identity Platform을 사용하여 보안 보장 마크 업 언어(SAML) 2.0 공급업체로 사용자를 로그인 처리하는 방법을 보여줍니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Identity Platform을 사용 설정하고 클라이언트 SDK를 앱에 추가합니다. 자세한 내용은 빠른 시작을 참조하세요.

공급업체 구성

  1. Cloud Console에서 ID 공급업체 페이지로 이동합니다.
    ID 공급업체 페이지로 이동

  2. 공급업체 추가를 클릭하고 목록에서 SAML을 선택합니다.

  3. 다음 세부정보를 입력합니다.

    1. 공급업체의 이름입니다. 공급업체 ID 또는 커스텀 이름과 동일할 수 있습니다. 커스텀 이름을 입력할 경우 공급업체 ID 옆에 있는 수정을 클릭하여 ID(saml.로 시작해야 함)를 지정합니다.

    2. 공급업체의 엔티티 ID입니다.

    3. 공급업체의 SAML SSO URL입니다.

    4. 공급업체에서 토큰 서명에 사용되는 인증서입니다. 시작 및 종료 문자열을 포함해야 합니다. 예를 들면 다음과 같습니다.

      -----BEGIN CERTIFICATE-----
      MIICajCCAdOgAwIBAgIBADANBgkqhkiG9w0BAQ0FADBSMQswCQYDVQQGEwJ1czEL
      ...
      LEzc1JwEGQQVDYQCwsQMSBDAF0QAB0w9GikhqkgBNADABIgABIwAgOdACCjaCIIM
      -----END CERTIFICATE-----
      
  4. 서비스 공급업체에 앱의 엔티티 ID를 입력합니다. 일반적으로 앱의 URL입니다. SAML ID 공급업체에서는 이를 대상이라고 합니다.

  5. 승인된 도메인 목록에 앱을 추가합니다. 예를 들어 앱의 로그인 URL이 https://example.com/login이면 example.com을 추가합니다.

  6. 필요한 경우 앱의 콜백 URL을 맞춤설정합니다. 일반적으로 SAML ID 공급업체에서 어설션 소비자 서비스(ACS) URL이라고 부릅니다.

    기본 콜백 URL을 사용하면 SAML 응답을 확인하는 복잡성이 줄어 듭니다. 이 흐름을 맞춤설정하는 경우 프로젝트의 Identity Platform 콜백 URL이 SAML ID 공급업체에 구성되어 있는지 확인합니다. 보통 https://<authDomain>/__/auth/handler와 같은 형식입니다. 자세한 내용은 인증 핸들러 맞춤설정을 참조하세요.

  7. 'Save(저장)'를 클릭합니다.

서명 요청

인증 요청에 서명하여 보안을 강화할 수 있습니다.

요청에 서명하려면 먼저 inboundSamlConfigs.patch()을 호출하고 idp_config.sign_requesttrue로 설정하여 ID 제공업체에 서명된 요청을 사용 설정합니다.

REST

HTTP 메서드 및 URL:

PATCH https://identitytoolkit.googleapis.com/admin/v2/projects/project-id/inboundSamlConfigs/provider-id?updateMask=idpConfig.signRequest

JSON 요청 본문:

{
  "idp_config": {
    "sign_request": true
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

 

서명된 요청을 사용 설정하려면 REST API를 사용해야 합니다. Cloud Console 또는 gcloud 명령줄 도구를 사용하는 것은 지원되지 않습니다.

응답은 SpCertificate의 배열을 포함하는 InboundSamlConfig 객체입니다. 요청의 서명을 검증할 수 있도록 SAML ID 공급업체로 X509 인증서 값을 구성합니다.

사용자 로그인

사용자가 로그인하면 클라이언트 SDK는 인증 핸드셰이크를 처리한 다음 페이로드에 SAML 속성이 포함된 ID 토큰을 반환합니다. 사용자를 로그인 처리해서 SAML 공급업체에서 속성을 가져오려면 다음 안내를 따르세요.

  1. 이전 섹션에서 구성한 공급업체 ID로 SAMLAuthProvider 인스턴스를 만듭니다. 공급업체 ID는 saml.로 시작해야 합니다.

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');
    
  2. 로그인 과정을 시작합니다. 팝업 또는 리디렉션을 사용하도록 선택할 수 있습니다.

    signInWithPopup()을 호출하여 팝업을 표시합니다.

    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 from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim
        // This is also available from result.user.getIdTokenResult()
        // idTokenResult.claims.firebase.sign_in_attributes.
      })
      .catch((error) => {
        // Handle error.
      });
    

    리디렉션

    로그인 페이지로 리디렉션하려면 signInWithRedirect()를 호출합니다.

    firebase.auth().signInWithRedirect(provider);
    

    그런 다음 getRedirectResult()를 호출하여 사용자가 앱으로 돌아올 때 결과를 가져옵니다.

    firebase.auth().getRedirectResult()
      .then((result) => {
        // User is signed in.
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim
        // This is also available from result.user.getIdTokenResult()
        // idTokenResult.claims.firebase.sign_in_attributes.
      }).catch((error) => {
        // Handle error.
      });
    
  3. firebase.sign_in_attributes 클레임을 사용하여 ID 토큰에서 SAML 공급자와 연결된 사용자 속성을 검색합니다. ID 토큰을 서버로 전송할 때 Admin SDK를 사용하여 ID 토큰을 확인하세요.

현재는 클라이언트의 SDK에서 서비스 공급업체가 시작하는 SAML 흐름만 지원됩니다.

사용자 계정 연결

사용자가 이미 다른 방식(예: 이메일/비밀번호)을 사용하여 앱에 로그인한 경우 linkWithPopup() 또는 linkWithRedirect()를 사용하여 기존 계정을 SAML 공급업체에 연결할 수 있습니다. 예를 들면 다음과 같습니다.

const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');

// Link with a popup.
firebase.auth().currentUser.linkWithPopup(provider)
    // currentUser.providerData now has an additional entry for this provider.
  }).catch((error) => {
    // Handle error.
  });

사용자 재인증

사용자의 이메일 또는 비밀번호 업데이트와 같은 민감한 특정 작업을 하려면 사용자가 최근에 로그인한 적이 있어야 합니다. 사용자를 다시 로그인 처리하려면 reauthenticateWithPopup() 또는 reauthenticateWithRedirect()를 호출합니다. 예를 들면 다음과 같습니다.

const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');

// Reauthenticate with a popup.
firebase.auth().currentUser.reauthenticateWithPopup(provider)
  .then((result) => {
    // Get the updated ID token.
    return result.user.getIdTokenResult();
  })
  .then((idTokenResult) => {
    // idTokenResult.authTime should be updated to reflect recent sign-in status.
    // idTokenResult.token has the latest ID token.
  })
  .catch((error) => {
    // Handle error.
  });

다음 단계