Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

AppleプラットフォームでGitHubを使用して認証する

Firebase SDK を使用して汎用 OAuth ログインをアプリに統合し、エンド ツー エンドのサインイン フローを実行することで、GitHub などの OAuth プロバイダーを使用して Firebase でユーザーを認証できます。

あなたが始める前に

GitHub アカウントを使用してユーザーをサインインするには、最初に GitHub を Firebase プロジェクトのサインイン プロバイダーとして有効にする必要があります。

Swift Package Manager を使用して、Firebase の依存関係をインストールおよび管理します。

  1. Xcode で、アプリ プロジェクトを開いた状態で、 File > Add Packagesに移動します。
  2. プロンプトが表示されたら、Firebase Apple プラットフォーム SDK リポジトリを追加します。
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Firebase Authentication ライブラリを選択します。
  5. 完了すると、Xcode はバックグラウンドで依存関係の解決とダウンロードを自動的に開始します。

ここで、いくつかの構成手順を実行します。

  1. Firebase コンソールで、 Authセクションを開きます。
  2. [サインイン方法] タブで、 GitHubプロバイダーを有効にします。
  3. そのプロバイダーの開発者コンソールからプロバイダー構成にクライアント IDクライアント シークレットを追加します。
    1. アプリを開発者アプリケーションとして GitHub に登録し、アプリの OAuth 2.0 Client IDClient Secretを取得します。
    2. GitHub アプリの configにあるアプリの設定ページで、Firebase OAuth リダイレクト URI (例: my-app-12345.firebaseapp.com/__/auth/handler ) が認証コールバック URLとして設定されていることを確認してください。
  4. [保存]をクリックします。

Firebase SDK でログイン フローを処理する

Firebase Apple プラットフォーム SDK でサインイン フローを処理するには、次の手順に従います。

  1. カスタム URL スキームを Xcode プロジェクトに追加します。

    1. プロジェクト構成を開きます。左側のツリー ビューでプロジェクト名をダブルクリックします。 [ターゲット] セクションからアプリを選択し、[情報] タブを選択して、[ URL の種類] セクションを展開します。
    2. [ + ] ボタンをクリックし、反転したクライアント ID の URL スキームを追加します。この値を見つけるには、 GoogleService-Info.plist構成ファイルを開き、 REVERSED_CLIENT_IDキーを探します。そのキーの値をコピーして、構成ページの [ URL スキーム]ボックスに貼り付けます。他のフィールドは空白のままにします。

      完了すると、構成は次のようになります (ただし、アプリケーション固有の値があります)。

  2. プロバイダー ID github.comを使用してOAuthProviderのインスタンスを作成します。

    迅速

        var provider = OAuthProvider(providerID: "github.com")
        

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"github.com"];
        
  3. オプション: OAuth 要求で送信する追加のカスタム OAuth パラメーターを指定します。

    迅速

        provider.customParameters = [
          "allow_signup": "false"
        ]
        

    Objective-C

        [provider setCustomParameters:@{@"allow_signup": @"false"}];
        

    GitHub がサポートするパラメーターについては、 GitHub OAuth ドキュメントを参照してください。 setCustomParametersで Firebase に必要なパラメータを渡すことはできないことに注意してください。これらのパラメータはclient_idredirect_uriresponse_typescope 、およびstateです。

  4. オプション: 基本プロファイル以外に、認証プロバイダーに要求する追加の OAuth 2.0 スコープを指定します。アプリケーションが GitHub API からプライベート ユーザー データにアクセスする必要がある場合は、GitHub 開発者コンソールのAPI 権限で GitHub API にアクセスするための権限を要求する必要があります。要求された OAuth スコープは、アプリの API 権限で事前構成されたものと正確に一致する必要があります。

    迅速

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        provider.scopes = ["user:email"]
        

    Objective-C

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        [provider setScopes:@[@"user:email"]];
        

    詳細については、 GitHub スコープのドキュメントを参照してください。

  5. オプション: reCAPTCHA をユーザーに表示するときにアプリがSFSafariViewControllerまたはUIWebViewを表示する方法をカスタマイズする場合は、 AuthUIDelegateプロトコルに準拠するカスタム クラスを作成し、それをcredentialWithUIDelegateに渡します。

  6. OAuth プロバイダー オブジェクトを使用して Firebase で認証します。

    迅速

        provider.getCredentialWith(nil) { credential, error in
          if error != nil {
            // Handle error.
          }
          if credential != nil {
            Auth().signIn(with: credential) { authResult, error in
              if error != nil {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
    
              guard let oauthCredential = authResult.credential as? OAuthCredential else { return }
              // GitHub OAuth access token can also be retrieved by:
              // oauthCredential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // oauthCredential.idToken
            }
          }
        }
        

    Objective-C

        [provider getCredentialWithUIDelegate:nil
                                   completion:^(FIRAuthCredential *_Nullable credential,
                                                NSError *_Nullable error) {
          if (error) {
           // Handle error.
          }
          if (credential) {
            [[FIRAuth auth] signInWithCredential:credential
                                      completion:^(FIRAuthDataResult *_Nullable authResult,
                                                NSError *_Nullable error) {
              if (error) {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
    
              FIROAuthCredential *oauthCredential = (FIROAuthCredential *)authResult.credential;
              // GitHub OAuth access token can also be retrieved by:
              // oauthCredential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // oauthCredential.idToken
            }];
          }
        }];
        

    OAuth アクセス トークンを使用して、 GitHub APIを呼び出すことができます。

    たとえば、基本的なプロファイル情報を取得するには、REST API を呼び出して、 Authorizationヘッダーでアクセス トークンを渡します。

    https://api.github.com/user
    
  7. 上記の例はサインイン フローに焦点を当てていますが、GitHub プロバイダーを既存のユーザーにリンクすることもできます。たとえば、複数のプロバイダーを同じユーザーにリンクして、いずれかでサインインできるようにすることができます。

    迅速

        Auth().currentUser.link(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // GitHub credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // GitHub OAuth access token can also be retrieved by:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            linkWithCredential:credential
                    completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // GitHub credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // GitHub OAuth access token is can also be retrieved by:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        
  8. 同じパターンをreauthenticateWithCredentialで使用できます。これを使用して、最近のログインが必要な機密操作の新しい資格情報を取得できます。

    迅速

        Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token is can also be retrieved by:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            reauthenticateWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token is can also be retrieved by:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        

次のステップ

ユーザーが初めてサインインすると、新しいユーザー アカウントが作成され、サインインに使用したユーザーの資格情報 (ユーザー名とパスワード、電話番号、または認証プロバイダー情報) にリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのサインイン方法に関係なく、プロジェクト内のすべてのアプリでユーザーを識別するために使用できます。

  • アプリでは、 Userオブジェクトからユーザーの基本的なプロファイル情報を取得できます。ユーザーの管理を参照してください。

  • Firebase Realtime Database と Cloud Storageセキュリティ ルールでは、サインインしているユーザーの一意のユーザー ID をauth変数から取得し、それを使用してユーザーがアクセスできるデータを制御できます。

認証プロバイダーの資格情報を既存のユーザー アカウントにリンクすることで、ユーザーが複数の認証プロバイダーを使用してアプリにサインインできるようにすることができます。

ユーザーをサインアウトするには、 signOut:を呼び出します。

迅速

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

Objective-C

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

認証エラーの全範囲に対してエラー処理コードを追加することもできます。エラーの処理を参照してください。