Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

전화번호를 사용하여 Apple 플랫폼에서 Firebase로 인증

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Firebase 인증을 사용하여 사용자의 전화로 SMS 메시지를 보내 사용자를 로그인할 수 있습니다. 사용자는 SMS 메시지에 포함된 일회용 코드를 사용하여 로그인합니다.

앱에 전화번호 로그인을 추가하는 가장 쉬운 방법은 FirebaseUI 를 사용하는 것입니다. 여기에는 전화번호 로그인을 위한 로그인 흐름과 비밀번호 기반 및 연합 로그인을 구현하는 드롭인 로그인 위젯이 포함되어 있습니다. -안에. 이 문서에서는 Firebase SDK를 사용하여 전화번호 로그인 흐름을 구현하는 방법을 설명합니다.

시작하기 전에

Swift 패키지 관리자를 사용하여 Firebase 종속 항목을 설치하고 관리합니다.

  1. Xcode에서 앱 프로젝트를 연 상태에서 파일 > 패키지 추가 로 이동합니다.
  2. 메시지가 표시되면 Firebase Apple 플랫폼 SDK 저장소를 추가합니다.
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Firebase 인증 라이브러리를 선택합니다.
  5. 완료되면 Xcode는 백그라운드에서 종속성을 자동으로 해결하고 다운로드하기 시작합니다.
그리고 구성 단계를 확인하십시오.
  1. 아직 앱을 Firebase 프로젝트에 연결하지 않았다면 Firebase 콘솔 에서 연결하세요.

보안 문제

전화번호만 사용하는 인증은 편리하지만 다른 사용 가능한 방법보다 안전하지 않습니다. 전화번호의 소유가 사용자 간에 쉽게 이전될 수 있기 때문입니다. 또한 여러 사용자 프로필이 있는 장치에서 SMS 메시지를 받을 수 있는 모든 사용자는 장치의 전화 번호를 사용하여 계정에 로그인할 수 있습니다.

앱에서 전화번호 기반 로그인을 사용하는 경우 더 안전한 로그인 방법과 함께 이를 제공하고 전화번호 로그인 사용의 보안 상충관계를 사용자에게 알려야 합니다.

Firebase 프로젝트에 전화번호 로그인 활성화

SMS로 사용자를 로그인하려면 먼저 Firebase 프로젝트에 대한 전화번호 로그인 방법을 활성화해야 합니다.

  1. Firebase 콘솔 에서 인증 섹션을 엽니다.
  2. 로그인 방법 페이지에서 전화번호 로그인 방법을 활성화합니다.

Firebase의 전화번호 로그인 요청 할당량은 대부분의 앱이 영향을 받지 않을 만큼 충분히 높습니다. 그러나 전화 인증을 사용하여 매우 많은 수의 사용자를 로그인해야 하는 경우 요금제를 업그레이드해야 할 수 있습니다. 가격 페이지를 참조하십시오.

앱 인증 사용

전화번호 인증을 사용하려면 Firebase에서 전화번호 로그인 요청이 앱에서 오는지 확인할 수 있어야 합니다. Firebase 인증이 이를 수행하는 두 가지 방법이 있습니다.

  • 무음 APN 알림 : 기기에서 처음으로 전화번호로 사용자를 로그인하면 Firebase 인증이 자동 푸시 알림을 사용하여 기기에 토큰을 보냅니다. 앱이 Firebase로부터 알림을 성공적으로 수신하면 전화번호 로그인을 진행할 수 있습니다.

    iOS 8.0 이상의 경우 자동 알림은 명시적인 사용자 동의가 필요하지 않으므로 사용자가 앱에서 APN 알림 수신을 거부해도 영향을 받지 않습니다. 따라서 앱은 Firebase 전화번호 인증을 구현할 때 푸시 알림을 받기 위해 사용자 권한을 요청할 필요가 없습니다.

  • reCAPTCHA 확인 : 사용자가 앱의 백그라운드 새로 고침을 비활성화한 경우 또는 iOS 시뮬레이터에서 앱을 테스트할 때와 같이 자동 푸시 알림을 보내거나 받을 수 없는 경우 Firebase 인증은 reCAPTCHA 확인을 사용하여 전화를 완료합니다. 로그인 흐름. reCAPTCHA 챌린지는 사용자가 아무 것도 풀지 않고도 완료할 수 있는 경우가 많습니다.

자동 푸시 알림이 올바르게 구성되면 극소수의 사용자만 reCAPTCHA 흐름을 경험하게 됩니다. 그럼에도 불구하고 자동 푸시 알림을 사용할 수 있는지 여부에 관계없이 전화 번호 로그인이 올바르게 작동하는지 확인해야 합니다.

무음 알림 수신 시작

Firebase 인증과 함께 사용할 APN 알림을 활성화하려면 다음 안내를 따르세요.

  1. Xcode에서 프로젝트에 대한 푸시 알림을 활성화 합니다.
  2. Firebase에 APN 인증 키를 업로드합니다. APN 인증 키가 아직 없는 경우 Apple 개발자 회원 센터 에서 생성해야 합니다.

    1. Firebase 콘솔의 프로젝트 내에서 톱니바퀴 아이콘을 선택하고 프로젝트 설정 을 선택한 다음 클라우드 메시징 탭을 선택합니다.

    2. iOS 앱 구성 아래의 APNs 인증 키 에서 업로드 버튼을 클릭합니다.

    3. 키를 저장한 위치를 찾아 선택하고 열기 를 클릭합니다. 키에 대한 키 ID를 추가하고( Apple 개발자 회원 센터 에서 사용 가능) 업로드 를 클릭합니다.

    APN 인증서가 이미 있는 경우 대신 인증서를 업로드할 수 있습니다.

reCAPTCHA 인증 설정

Firebase SDK에서 reCAPTCHA 확인을 사용하도록 설정하려면 다음 안내를 따르세요.

  1. Xcode 프로젝트에 사용자 지정 URL 구성표를 추가합니다.
    1. 프로젝트 구성을 엽니다. 왼쪽 트리 보기에서 프로젝트 이름을 두 번 클릭합니다. 대상 섹션에서 을 선택한 다음 정보 탭을 선택하고 URL 유형 섹션을 확장합니다.
    2. + 버튼을 클릭하고 역방향 클라이언트 ID에 대한 URL 구성표를 추가합니다. 이 값을 찾으려면 GoogleService-Info.plist 구성 파일을 열고 REVERSED_CLIENT_ID 키를 찾으십시오. 해당 키의 값을 복사하여 구성 페이지의 URL 구성표 상자에 붙여넣습니다. 다른 필드는 비워 둡니다.

      완료되면 구성이 다음과 유사하게 표시되어야 합니다(단, 애플리케이션별 값 포함).

  2. 선택 사항 : 사용자에게 reCAPTCHA를 표시할 때 앱이 SFSafariViewController 를 표시하는 방식을 사용자 지정하려면 AuthUIDelegate 프로토콜을 준수하는 사용자 지정 클래스를 만들고 verifyPhoneNumber(_:uiDelegate:completion:) 에 전달합니다.

사용자의 전화로 인증 코드 보내기

전화번호 로그인을 시작하려면 전화번호를 제공하라는 인터페이스를 사용자에게 제공한 다음 verifyPhoneNumber(_:uiDelegate:completion:) 를 호출하여 Firebase에서 SMS로 사용자 전화로 인증 코드를 보내도록 요청합니다.

  1. 사용자의 전화번호를 가져옵니다.

    법적 요구 사항은 다양하지만 모범 사례로서 사용자에 대한 기대치를 설정하려면 사용자가 전화 로그인을 사용하는 경우 확인을 위한 SMS 메시지를 수신할 수 있으며 표준 요금이 적용될 수 있음을 알려야 합니다.

  2. verifyPhoneNumber(_:uiDelegate:completion:) 을 호출하여 사용자의 전화번호를 전달합니다.

    빠른

    PhoneAuthProvider.provider()
      .verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in
          if let error = error {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // Sign in using the verificationID and the code sent to the user
          // ...
      }

    오브젝티브-C

    [[FIRPhoneAuthProvider provider] verifyPhoneNumber:userInput
                                            UIDelegate:nil
                                            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
      if (error) {
        [self showMessagePrompt:error.localizedDescription];
        return;
      }
      // Sign in using the verificationID and the code sent to the user
      // ...
    }];

    verifyPhoneNumber 메서드는 재진입입니다. 뷰의 onAppear 메서드와 같이 여러 번 호출하면 verifyPhoneNumber 메서드는 원래 요청이 시간 초과되지 않는 한 두 번째 SMS를 보내지 않습니다.

    verifyPhoneNumber(_:uiDelegate:completion:) 을 호출하면 Firebase에서 앱에 자동 푸시 알림을 보내거나 사용자에게 reCAPTCHA 질문을 발행합니다. 앱이 알림을 수신하거나 사용자가 reCAPTCHA 챌린지를 완료하면 Firebase는 인증 코드가 포함된 SMS 메시지를 지정된 전화번호로 보내고 인증 ID를 완료 함수에 전달합니다. 사용자를 로그인하려면 인증 코드와 인증 ID가 모두 필요합니다.

    Firebase에서 보낸 SMS 메시지는 Auth 인스턴스의 languageCode 속성을 통해 인증 언어를 지정하여 현지화할 수도 있습니다.

    빠른

     // Change language code to french.
     Auth.auth().languageCode = "fr";
    

    오브젝티브-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. 인증 ID를 저장하고 앱이 로드되면 복원합니다. 이렇게 하면 사용자가 로그인 과정을 완료하기 전에 앱이 종료되는 경우(예: SMS 앱으로 전환하는 동안) 유효한 확인 ID를 계속 보유하고 있는지 확인할 수 있습니다.

    원하는 방식으로 확인 ID를 유지할 수 있습니다. 간단한 방법은 NSUserDefaults 개체로 확인 ID를 저장하는 것입니다.

    빠른

    UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
    

    오브젝티브-C

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:verificationID forKey:@"authVerificationID"];
    

    그런 다음 저장된 값을 복원할 수 있습니다.

    빠른

    let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
    

    오브젝티브-C

    NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
    

verifyPhoneNumber(_:uiDelegate:completion:) 호출이 성공하면 SMS 메시지로 확인 코드를 수신할 때 사용자에게 확인 코드를 입력하라는 메시지를 표시할 수 있습니다.

인증 코드로 사용자 로그인

사용자가 SMS 메시지의 확인 코드를 앱에 제공한 후 확인 코드 및 확인 ID에서 FIRPhoneAuthCredential 개체를 만들고 해당 개체를 signInWithCredential:completion: 에 전달하여 사용자를 로그인합니다.

  1. 사용자로부터 인증 코드를 받습니다.
  2. 확인 코드 및 확인 ID에서 FIRPhoneAuthCredential 개체를 만듭니다.

    빠른

    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationID,
      verificationCode: verificationCode
    )

    오브젝티브-C

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. FIRPhoneAuthCredential 개체를 사용하여 사용자 로그인:

    빠른

    Auth.auth().signIn(with: credential) { authResult, error in
        if let error = error {
          let authError = error as NSError
          if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue {
            // The user is a multi-factor user. Second factor challenge is required.
            let resolver = authError
              .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
            var displayNameString = ""
            for tmpFactorInfo in resolver.hints {
              displayNameString += tmpFactorInfo.displayName ?? ""
              displayNameString += " "
            }
            self.showTextInputPrompt(
              withMessage: "Select factor to sign in\n\(displayNameString)",
              completionBlock: { userPressedOK, displayName in
                var selectedHint: PhoneMultiFactorInfo?
                for tmpFactorInfo in resolver.hints {
                  if displayName == tmpFactorInfo.displayName {
                    selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
                  }
                }
                PhoneAuthProvider.provider()
                  .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil,
                                     multiFactorSession: resolver
                                       .session) { verificationID, error in
                    if error != nil {
                      print(
                        "Multi factor start sign in failed. Error: \(error.debugDescription)"
                      )
                    } else {
                      self.showTextInputPrompt(
                        withMessage: "Verification code for \(selectedHint?.displayName ?? "")",
                        completionBlock: { userPressedOK, verificationCode in
                          let credential: PhoneAuthCredential? = PhoneAuthProvider.provider()
                            .credential(withVerificationID: verificationID!,
                                        verificationCode: verificationCode!)
                          let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator
                            .assertion(with: credential!)
                          resolver.resolveSignIn(with: assertion!) { authResult, error in
                            if error != nil {
                              print(
                                "Multi factor finanlize sign in failed. Error: \(error.debugDescription)"
                              )
                            } else {
                              self.navigationController?.popViewController(animated: true)
                            }
                          }
                        }
                      )
                    }
                  }
              }
            )
          } else {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // ...
          return
        }
        // User is signed in
        // ...
    }

    오브젝티브-C

    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                           NSError * _Nullable error) {
        if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
          FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
          NSMutableString *displayNameString = [NSMutableString string];
          for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
            [displayNameString appendString:tmpFactorInfo.displayName];
            [displayNameString appendString:@" "];
          }
          [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                               completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
           FIRPhoneMultiFactorInfo* selectedHint;
           for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
             if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
               selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
             }
           }
           [FIRPhoneAuthProvider.provider
            verifyPhoneNumberWithMultiFactorInfo:selectedHint
            UIDelegate:nil
            multiFactorSession:resolver.session
            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
              if (error) {
                [self showMessagePrompt:error.localizedDescription];
              } else {
                [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                     completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
                 FIRPhoneAuthCredential *credential =
                     [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                                  verificationCode:verificationCode];
                 FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
                 [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
                   if (error) {
                     [self showMessagePrompt:error.localizedDescription];
                   } else {
                     NSLog(@"Multi factor finanlize sign in succeeded.");
                   }
                 }];
               }];
              }
            }];
         }];
        }
      else if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      if (authResult == nil) { return; }
      FIRUser *user = authResult.user;
      // ...
    }];

가상의 전화번호로 테스트

Firebase 콘솔을 통해 개발용 가상 전화번호를 설정할 수 있습니다. 가상 전화번호로 테스트하면 다음과 같은 이점이 있습니다.

  • 사용량 할당량을 소모하지 않고 전화번호 인증을 테스트합니다.
  • 실제 SMS 메시지를 보내지 않고 전화 번호 인증을 테스트합니다.
  • 제한 없이 동일한 전화번호로 연속 테스트를 실행합니다. 이렇게 하면 검토자가 테스트에 동일한 전화번호를 사용하는 경우 앱 스토어 검토 과정에서 거부될 위험이 최소화됩니다.
  • Google Play 서비스 없이 iOS 시뮬레이터 또는 Android 에뮬레이터에서 개발하는 기능과 같은 추가 노력 없이 개발 환경에서 쉽게 테스트할 수 있습니다.
  • 프로덕션 환경에서 실제 전화번호에 일반적으로 적용되는 보안 검사에 의해 차단되지 않고 통합 테스트를 작성합니다.

가상 전화번호는 다음 요구 사항을 충족해야 합니다.

  1. 실제로 존재하지 않는 가상의 전화번호를 사용해야 합니다. Firebase 인증에서는 실제 사용자가 사용하는 기존 전화번호를 테스트 번호로 설정할 수 없습니다. 한 가지 옵션은 555개의 접두사 번호를 미국 테스트 전화 번호로 사용하는 것입니다(예: +1 650-555-3434) .
  2. 전화번호는 길이 및 기타 제약 조건에 따라 올바른 형식이어야 합니다. 그들은 여전히 ​​​​실제 사용자의 전화 번호와 동일한 유효성 검사를 거칩니다.
  3. 개발용 전화번호는 최대 10개까지 추가할 수 있습니다.
  4. 추측하기 어려운 테스트 전화번호/코드를 사용하고 자주 변경합니다.

가상의 전화번호 및 인증 코드 생성

  1. Firebase 콘솔 에서 인증 섹션을 엽니다.
  2. 아직 활성화하지 않은 경우 로그인 방법 탭에서 전화 공급자를 활성화합니다.
  3. 테스트용 아코디언 메뉴를 위한 전화번호를 엽니다.
  4. 테스트할 전화번호를 입력하세요(예: +1 650-555-3434 ) .
  5. 해당 특정 번호에 대한 6자리 인증 코드를 제공합니다(예: 654321 ) .
  6. 번호를 추가 합니다. 필요한 경우 해당 행 위로 마우스를 가져간 후 휴지통 아이콘을 클릭하여 전화번호와 해당 코드를 삭제할 수 있습니다.

수동 테스트

애플리케이션에서 가상의 전화번호를 직접 사용할 수 있습니다. 이를 통해 할당량 문제나 제한 없이 개발 단계에서 수동 테스트를 수행할 수 있습니다. Google Play 서비스를 설치하지 않고 iOS 시뮬레이터 또는 Android 에뮬레이터에서 직접 테스트할 수도 있습니다.

가상 전화번호를 제공하고 인증 코드를 보내면 실제 SMS가 전송되지 않습니다. 대신 로그인을 완료하려면 이전에 구성된 인증 코드를 제공해야 합니다.

로그인이 완료되면 해당 전화번호로 Firebase 사용자가 생성됩니다. 사용자는 실제 전화번호 사용자와 동일한 행동 및 속성을 가지며 동일한 방식으로 실시간 데이터베이스/Cloud Firestore 및 기타 서비스에 액세스할 수 있습니다. 이 과정에서 생성된 ID 토큰은 실제 전화번호 사용자와 동일한 서명을 갖는다.

또 다른 옵션은 액세스를 추가로 제한하려는 경우 이러한 사용자에 대한 사용자 지정 클레임을 통해 테스트 역할을 설정하여 가짜 사용자로 구별하는 것입니다.

통합 테스트

수동 테스트 외에도 Firebase 인증은 전화 인증 테스트를 위한 통합 테스트를 작성하는 데 도움이 되는 API를 제공합니다. 이러한 API는 웹에서 reCAPTCHA 요구 사항을 비활성화하고 iOS에서 자동 푸시 알림을 비활성화하여 앱 확인을 비활성화합니다. 따라서 이러한 흐름에서 자동화 테스트가 가능하고 구현이 더 쉽습니다. 또한 Android에서 즉각적인 확인 흐름을 테스트하는 기능을 제공하는 데 도움이 됩니다.

iOS에서는 appVerificationDisabledForTesting 를 호출하기 전에 verifyPhoneNumber 설정을 TRUE 로 설정해야 합니다. 이것은 APN 토큰을 요구하지 않고 백그라운드에서 자동 푸시 알림을 보내지 않고 처리되므로 시뮬레이터에서 더 쉽게 테스트할 수 있습니다. 이렇게 하면 reCAPTCHA 대체 흐름도 비활성화됩니다.

앱 인증이 비활성화된 경우 가상 전화번호를 사용하면 로그인이 완료되지 않습니다. 이 API에는 가상 전화번호만 사용할 수 있습니다.

빠른

let phoneNumber = "+16505554567"

// This test verification code is specified for the given test phone number in the developer console.
let testVerificationCode = "123456"

Auth.auth().settings.isAppVerificationDisabledForTesting = TRUE
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) {
                                                            verificationID, error in
    if (error) {
      // Handles error
      self.handleError(error)
      return
    }
    let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",
                                                               verificationCode: testVerificationCode)
    Auth.auth().signInAndRetrieveData(with: credential) { authData, error in
      if (error) {
        // Handles error
        self.handleError(error)
        return
      }
      _user = authData.user
    }];
}];

오브젝티브-C

NSString *phoneNumber = @"+16505554567";

// This test verification code is specified for the given test phone number in the developer console.
NSString *testVerificationCode = @"123456";

[FIRAuth auth].settings.appVerificationDisabledForTesting = YES;
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:phoneNumber
                                        completion:^(NSString *_Nullable verificationID,
                                                     NSError *_Nullable error) {
    if (error) {
      // Handles error
      [self handleError:error];
      return;
    }
    FIRAuthCredential *credential =
        [FIRPhoneAuthProvider credentialWithVerificationID:verificationID
                                          verificationCode:testVerificationCode];
    [FIRAuth auth] signInWithAndRetrieveDataWithCredential:credential
                                                completion:^(FIRUser *_Nullable user,
                                                             NSError *_Nullable error) {
      if (error) {
        // Handles error
        [self handleError:error];
        return;
      }
      _user = user;
    }];
}];

부록: Swizzling 없이 전화 로그인 사용

Firebase 인증은 메서드 재구성을 사용하여 앱의 APN 토큰을 자동으로 가져오고, Firebase가 앱에 보내는 자동 푸시 알림을 처리하고, 확인 중에 reCAPTCHA 확인 페이지에서 사용자 지정 체계 리디렉션을 자동으로 가로챕니다.

스위즐링을 사용하지 않으려면 FirebaseAppDelegateProxyEnabled 플래그를 앱의 Info.plist 파일에 추가하고 NO 로 설정하여 스위즐링을 비활성화할 수 있습니다. 이 플래그를 NO 로 설정하면 Firebase 클라우드 메시징을 포함한 다른 Firebase 제품의 스위즐링도 비활성화됩니다.

스위즐링을 비활성화하는 경우 APN 장치 토큰, 푸시 알림 및 사용자 지정 체계 리디렉션 URL을 Firebase 인증으로 명시적으로 전달해야 합니다.

SwiftUI 애플리케이션을 빌드하는 경우 APN 장치 토큰, 푸시 알림 및 사용자 지정 체계 리디렉션 URL도 Firebase 인증으로 명시적으로 전달해야 합니다.

APN 장치 토큰을 얻으려면 application(_:didRegisterForRemoteNotificationsWithDeviceToken:) 메서드를 구현하고 그 안에서 장치 토큰을 AuthsetAPNSToken(_:type:) 메서드에 전달합니다.

빠른

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  // Pass device token to auth
  Auth.auth().setAPNSToken(deviceToken, type: .prod)

  // Further handling of the device token if needed by the app
  // ...
}

오브젝티브-C

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  // Pass device token to auth.
  [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd];
  // Further handling of the device token if needed by the app.
}

푸시 알림을 처리하려면 application(_:didReceiveRemoteNotification:fetchCompletionHandler:): 메서드에서 AuthcanHandleNotification(_:) 메서드를 호출하여 Firebase 인증 관련 알림을 확인합니다.

빠른

func application(_ application: UIApplication,
    didReceiveRemoteNotification notification: [AnyHashable : Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  if Auth.auth().canHandleNotification(notification) {
    completionHandler(.noData)
    return
  }
  // This notification is not auth related; it should be handled separately.
}

오브젝티브-C

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)notification
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // Pass notification to auth and check if they can handle it.
  if ([[FIRAuth auth] canHandleNotification:notification]) {
    completionHandler(UIBackgroundFetchResultNoData);
    return;
  }
  // This notification is not auth related; it should be handled separately.
}

사용자 지정 스키마 리디렉션 URL을 처리하려면 application(_:open:options:) 메서드를 구현하고 그 안에 URL을 AuthcanHandleURL(_:) 메서드에 전달합니다.

빠른

func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related; it should be handled separately.
}

오브젝티브-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related; it should be handled separately.
}

SwiftUI 또는 UISceneDelegate 를 사용하는 경우 리디렉션 URL을 처리하려면 scene(_:openURLContexts:) 메서드를 구현하고 그 안에서 URL을 AuthcanHandleURL(_:) 메서드에 전달합니다.

빠른

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
  for urlContext in URLContexts {
      let url = urlContext.url
      Auth.auth().canHandle(url)
  }
  // URL not auth related; it should be handled separately.
}

오브젝티브-C

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.url];
    // URL not auth related; it should be handled separately.
  }
}

다음 단계

사용자가 처음으로 로그인하면 새 사용자 계정이 생성되어 사용자가 로그인한 자격 증명(사용자 이름 및 암호, 전화 번호 또는 인증 공급자 정보)에 연결됩니다. 이 새 계정은 Firebase 프로젝트의 일부로 저장되며 사용자 로그인 방식에 관계없이 프로젝트의 모든 앱에서 사용자를 식별하는 데 사용할 수 있습니다.

  • 앱에서 FIRUser 개체에서 사용자의 기본 프로필 정보를 가져올 수 있습니다. 사용자 관리 를 참조하십시오.

  • Firebase 실시간 데이터베이스 및 Cloud Storage 보안 규칙 에서 auth 변수에서 로그인한 사용자의 고유 사용자 ID를 가져와 사용자가 액세스할 수 있는 데이터를 제어하는 ​​데 사용할 수 있습니다.

인증 공급자 자격 증명을 기존 사용자 계정에 연결하여 사용자가 여러 인증 공급자를 사용하여 앱에 로그인하도록 허용할 수 있습니다.

사용자를 로그아웃하려면 signOut: 을 호출하십시오.

빠른

    let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}
  

오브젝티브-C

    NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

인증 오류의 전체 범위에 대한 오류 처리 코드를 추가할 수도 있습니다. 오류 처리 를 참조하십시오.