Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

Apple 및 Unity를 사용하여 인증

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

Firebase SDK를 사용하여 종단 간 OAuth 2.0 로그인 흐름을 수행함으로써 사용자가 Apple ID를 사용하여 Firebase에 인증하도록 할 수 있습니다.

시작하기 전에

Apple을 사용하여 사용자를 로그인하려면 먼저 Apple 개발자 사이트에서 Apple로 로그인을 구성한 다음 Firebase 프로젝트의 로그인 공급자로 Apple을 활성화합니다.

Apple 개발자 프로그램에 참여

Apple로 로그인은 Apple 개발자 프로그램 회원만 구성할 수 있습니다.

Apple로 로그인 구성

Firebase 프로젝트에서 Apple 로그인을 활성화하고 올바르게 구성해야 합니다. Apple 개발자 구성은 Android 및 Apple 플랫폼에 따라 다릅니다. 계속하기 전에 iOS+ 및/또는 Android 가이드의 "Apple로 로그인 구성" 섹션을 따르십시오.

Apple을 로그인 공급자로 활성화

  1. Firebase 콘솔 에서 인증 섹션을 엽니다. 로그인 방법 탭에서 Apple 공급자를 활성화합니다.
  2. Apple 로그인 제공자 설정을 구성합니다.
    1. Apple 플랫폼에만 앱을 배포하는 경우 서비스 ID, Apple 팀 ID, 개인 키 및 키 ID 필드를 비워 둘 수 있습니다.
    2. Android 기기 지원:
      1. Android 프로젝트에 Firebase를 추가합니다 . Firebase 콘솔에서 앱을 설정할 때 앱의 SHA-1 서명을 등록해야 합니다.
      2. Firebase 콘솔 에서 인증 섹션을 엽니다. 로그인 방법 탭에서 Apple 공급자를 활성화합니다. 이전 섹션에서 생성한 서비스 ID를 지정합니다. 또한 OAuth 코드 흐름 구성 섹션에서 Apple 팀 ID와 이전 섹션에서 생성한 개인 키 및 키 ID를 지정합니다.

Apple의 익명 데이터 요구 사항 준수

Apple로 로그인은 사용자가 로그인할 때 이메일 주소를 포함한 데이터를 익명화할 수 있는 옵션을 제공합니다. 이 옵션을 선택한 사용자는 privaterelay.appleid.com 도메인의 이메일 주소를 갖게 됩니다. 앱에서 Apple로 로그인을 사용하는 경우 이러한 익명화된 Apple ID와 관련하여 Apple의 모든 해당 개발자 정책 또는 조건을 준수해야 합니다.

여기에는 직접 식별하는 개인 정보를 익명의 Apple ID와 연결하기 전에 필요한 사용자 동의를 얻는 것이 포함됩니다. Firebase 인증을 사용할 때 여기에는 다음 작업이 포함될 수 있습니다.

  • 이메일 주소를 익명의 Apple ID에 연결하거나 그 반대의 경우도 마찬가지입니다.
  • 전화번호를 익명의 Apple ID에 연결하거나 그 반대로 연결
  • 익명이 아닌 소셜 자격 증명(Facebook, Google 등)을 익명의 Apple ID에 연결하거나 그 반대의 경우도 마찬가지입니다.

위의 목록은 완전하지 않습니다. 앱이 Apple의 요구 사항을 충족하는지 확인하려면 개발자 계정의 멤버십 섹션에 있는 Apple 개발자 프로그램 사용권 계약을 참조하십시오.

Firebase.Auth.FirebaseAuth 클래스에 액세스

FirebaseAuth 클래스는 모든 API 호출의 게이트웨이입니다. FirebaseAuth.DefaultInstance 를 통해 액세스할 수 있습니다.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Firebase SDK로 로그인 흐름 처리

Apple로 로그인하는 프로세스는 Apple 및 Android 플랫폼에 따라 다릅니다.

Apple 플랫폼에서

  1. Unity의 Sign In With Apple Asset Storage Package 와 같은 Apple 로그인 임시 및 토큰 생성을 처리하는 타사 플러그인을 설치합니다. Firebase 작업에서 사용하기 위해 생성된 임의의 nonce 문자열을 원시 문자열 상태로 연결하도록 코드를 변경해야 할 수 있습니다(즉, nonce의 SHA256 다이제스트 형식이 생성되기 전에 복사본을 저장).

  2. 결과 토큰 문자열과 원시 nonce를 사용하여 Firebase 자격 증명을 구성하고 Firebase에 로그인합니다.

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

  3. 최근 로그인이 필요한 민감한 작업에 대한 새로운 자격 증명을 검색하는 데 사용할 수 있는 ReauthenticateAsync 와 동일한 패턴을 사용할 수 있습니다. 자세한 내용은 사용자 관리 를 참조하십시오.

  4. Apple 플랫폼에서 Apple 로그인으로 연결할 때 기존 Firebase 계정이 이미 Apple 계정에 연결되었다는 오류가 발생할 수 있습니다. 이 경우 표준 Firebase.FirebsaeException 대신 Firebase.Auth.FirebaseAccountLinkException 이 발생합니다. 예외에는 유효한 경우 FirebaseAuth.SignInWithCredential 을 통해 Apple에 연결된 사용자 로그인에 사용할 수 있는 UserInfo.UpdatedCredential 속성이 포함됩니다. 업데이트된 자격 증명은 로그인 작업을 위해 nonce가 있는 새 Apple 로그인 토큰을 생성할 필요가 없습니다.

    LinkWithCredentialAsync 는 링크 실패 시 표준 Firebase.FirebaseException 을 계속 발생시키므로 업데이트된 자격 증명을 반환할 수 없습니다.

    auth.CurrentUser.LinkAndRetrieveDataWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompleted) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( signInTask => {
                      // Handle Sign in result.
                    });
                } else {
                  DebugLog("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });
    

안드로이드에서

Android에서는 Firebase SDK를 사용하여 웹 기반 일반 OAuth 로그인을 앱에 통합하여 Firebase로 사용자를 인증하여 종단 간 로그인 흐름을 수행합니다.

Firebase SDK로 로그인 흐름을 처리하려면 다음 단계를 따르세요.

  1. Apple에 적합한 제공자 ID로 구성된 FederatedOAuthProviderData 의 인스턴스를 구성하십시오.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. 옵션: 인증 제공자에게 요청하려는 기본값 외에 추가 OAuth 2.0 범위를 지정하십시오.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. 선택 사항: Apple의 로그인 화면을 영어 이외의 언어로 표시하려면 locale 매개변수를 설정하십시오. 지원되는 로케일은 Apple로 로그인 문서 를 참조하십시오.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. 공급자 데이터가 구성되면 이를 사용하여 FederatedOAuthProvider를 생성합니다.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. 인증 제공자 객체를 사용하여 Firebase에 인증합니다. 다른 FirebaseAuth 작업과 달리 사용자가 자격 증명을 입력할 수 있는 웹 보기를 표시하여 UI를 제어합니다.

    로그인 흐름을 시작하려면 signInWithProvider 를 호출하십시오.

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. 최근 로그인이 필요한 민감한 작업에 대한 새로운 자격 증명을 검색하는 데 사용할 수 있는 ReauthenticateWithProvider 와 동일한 패턴을 사용할 수 있습니다.

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. 또한 linkWithCredential() 을 사용하여 다른 ID 공급자를 기존 계정에 연결할 수 있습니다.

    Apple은 Apple 계정을 다른 데이터에 연결하기 전에 사용자의 명시적 동의를 요구합니다.

    예를 들어 Facebook 계정을 현재 Firebase 계정에 연결하려면 사용자가 Facebook에 로그인할 때 얻은 액세스 토큰을 사용합니다.

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkAndRetrieveDataWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkAndRetrieveDataWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkAndRetrieveDataWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.SignInResult signInResult = task.Result;
          Firebase.Auth.FirebaseUser user = signInResult.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

Apple Notes로 로그인

Firebase Auth에서 지원하는 다른 제공업체와 달리 Apple은 사진 URL을 제공하지 않습니다.

또한 사용자가 이메일을 앱과 공유하지 않기로 선택하면 Apple은 해당 사용자의 고유한 이메일 주소( xyz@privaterelay.appleid.com 형식)를 제공하여 앱과 공유합니다. 개인 이메일 릴레이 서비스를 구성한 경우 Apple은 익명 주소로 전송된 이메일을 사용자의 실제 이메일 주소로 전달합니다.

Apple은 사용자가 처음 로그인할 때만 표시 이름과 같은 사용자 정보를 앱과 공유합니다. 일반적으로 Firebase는 사용자가 Apple에 처음 로그인할 때 표시 이름을 저장하며 getCurrentUser().getDisplayName() 을 사용하여 가져올 수 있습니다. 그러나 이전에 Apple을 사용하여 Firebase를 사용하지 않고 앱에 사용자를 로그인한 경우 Apple은 Firebase에 사용자의 표시 이름을 제공하지 않습니다.

다음 단계

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

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

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