コンソールへ移動

JavaScript による Yahoo を使用した認証

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

始める前に

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

  1. Firebase を iOS プロジェクトに追加します
  2. Firebase コンソールで [Authentication] セクションを開きます。
  3. [ログイン方法] タブで、[Yahoo!] プロバイダを有効にします。
  4. そのプロバイダのデベロッパー コンソールで取得したクライアント IDクライアント シークレットをプロバイダ構成に追加します。
    1. Yahoo OAuth クライアントを登録するには、ウェブ アプリケーションの登録に関する Yahoo の手順を実施してください。
    2. こうしたプロバイダにアプリを登録するときは、必ずプロジェクトの *.firebaseapp.com ドメインをアプリのリダイレクト ドメインとして登録してください。
  5. [保存] をクリックします。

Firebase SDK を使用したログインフローの処理

Firebase iOS SDK でログインフローを処理する手順は次のとおりです。

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

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

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

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

    Swift

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

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"yahoo.com"];
        
  3. 省略可: OAuth リクエストと一緒に送信したい追加のカスタム OAuth パラメータを指定します。

    Swift

        provider.customParameters = [
          "prompt": "login",
          "language": "fr"
          ]
        

    Objective-C

        [provider setCustomParameters:@{@"prompt": @"login", @"language": @"fr"}];
        

    Yahoo がサポートするパラメータについては、Yahoo の OAuth に関するドキュメントをご覧ください。setCustomParameters で Firebase の必須のパラメータを渡すことはできません。該当するパラメータは、client_idredirect_uriresponse_typescopestate です。

  4. 省略可: 認証プロバイダにリクエストする、基本的なプロフィール以外の追加の OAuth 2.0 スコープを指定します。アプリケーションで Yahoo API から限定公開のユーザーデータへのアクセスが必要な場合は、Yahoo のデベロッパー コンソールの [API Permissions] で、Yahoo API に権限をリクエストする必要があります。リクエストされた OAuth スコープは、アプリの API 権限で事前構成されたものと完全一致する必要があります。たとえば、読み取り / 書き込みアクセスがユーザーの連絡先にリクエストされ、それがアプリの API 権限で事前構成されている場合は、読み取り専用の OAuth スコープ sdct-r の代わりに sdct-w を渡す必要があります。そうでなければ、フローは失敗し、エンドユーザーにエラーが表示されます。

    Swift

        // Request access to Yahoo Mail API.
        // Request read/write access to user contacts.
        // This must be preconfigured in the app's API permissions.
        provider.scopes = ["mail-r", "sdct-w"]
        

    Objective-C

        // Request access to Yahoo Mail API.
        // Request read/write access to user contacts.
        // This must be preconfigured in the app's API permissions.
        [provider setScopes:@[@"mail-r", @"sdct-w"]];
        

    詳しくは、Yahoo のスコープに関するドキュメントをご覧ください。

  5. 省略可: アプリがユーザーに reCAPTCHA を表示する際の SFSafariViewController または UIWebView の提示方法をカスタマイズするには、FIRAuthUIDelegate プロトコルに従ったカスタムクラスを作成して、そのクラスを getCredentialWithUIDelegate:completion: に渡します。

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

    Swift

        provider.getCredentialWithUIDelegate(nil) { credential, error in
          if error != nil {
            // Handle error.
          }
          if credential != nil {
            Auth().signInAndRetrieveData(with: credential) { authResult, error in
              if error != nil {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // Yahoo OAuth access token can also be retrieved by:
              // credential.accessToken
              // Yahoo OAuth ID token can be retrieved by calling:
              // credential.idToken
            }
          }
        }
        

    Objective-C

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

    OAuth アクセス トークンを使用して、Yahoo API を呼び出せます。

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

    https://social.yahooapis.com/v1/user/YAHOO_USER_UID/profile?format=json
    

    YAHOO_USER_UID は、Auth.auth.currentUser.providerData[0].uid フィールド、または authResult.additionalUserInfo.profile から取得できる Yahoo ユーザーの ID です。

  7. 上記の例ではログインフローを中心に説明していますが、linkWithPopup を使用して Yahoo プロバイダを既存のユーザーにリンクすることもできます。たとえば、複数のプロバイダを同じユーザーにリンクして、どれでもログインできるようにすることができます。

    Swift

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

    Objective-C

        [[FIRAuth auth].currentUser
            linkAndRetrieveDataWithCredential:credential
                                   completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // Yahoo credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // Yahoo OAuth access token is can also be retrieved by:
          // credential.accessToken
          // Yahoo OAuth ID token can be retrieved by calling:
          // credential.idToken
        }];
        
  8. 同じパターンを reauthenticateWithPopupreauthenticateWithRedirect でも使用できます。これらは、ログインしてから短時間のうちに行うべき機密性の高い操作のために、最新の認証情報を取得するのに使われます。

    Swift

        Auth().currentUser.reauthenticateAndRetrieveDataWithCredential(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:
          // credential.accessToken
          // Yahoo OAuth ID token can be retrieved by calling:
          // credential.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            reauthenticateAndRetrieveDataWithCredential: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:
          // credential.accessToken
          // Yahoo OAuth ID token can be retrieved by calling:
          // credential.idToken
        }];
        

次のステップ

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

  • アプリでは、FIRUser オブジェクトからユーザーの基本的なプロフィール情報を取得できます。ユーザーの管理についての記事をご覧ください。

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

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

ユーザーのログアウトを行うには、signOut: を呼び出します。

Swift

    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;
}

さまざまな認証エラーに対応できるようにエラー処理コードを追加することもできます。エラーの処理についての記事をご覧ください。