元のドキュメント: developer.apple.com/documentation/AuthenticationServices/implementing-user-authentication-with-sign-in-with-apple


サンプルコード


Apple でサインインを使用したユーザー認証を実装する


あなたのアプリのユーザーがアカウントを設定し、あなたのサービスを利用開始できる方法を提供してください。


Download

(このボタンはただのかざりです)

iOS 13.0+ iPadOS 13.0+ Mac Catalyst 13.0+ Xcode 11.3+




概観


このサンプルアプリ「Juice」は、AuthenticationServices フレームワークを使用して、ユーザーがアカウントを設定し、Apple ID でサインインするためのインターフェースを提供します。アプリは、ユーザーがアプリのアカウントを作成および設定できるフォームを表示し、次に「Apple でサインイン」を使用してユーザーの Apple ID を認証し、ユーザーのアカウントデータを表示します。


iOS 12 以前のバージョンで「Apple でサインイン」を実装する方法の詳細については、他のプラットフォームへの「Apple でサインイン」の統合 を参照してください。



サンプルコードプロジェクトの構成


サンプルコードプロジェクトを構成するには、Xcode で以下の手順を実行してください。


  1. 「署名と機能」ペインで、バンドル ID を設定 して一意の識別子にします(続行するにはバンドル ID を変更しなければなりません)。

  2. Apple ID アカウントを追加しターゲットをチームに割り当てて、Xcode があなたのプロビジョニングプロファイルで「Apple でサインイン」機能を有効にできるようにします。

  3. スキームのポップアップメニューから、Apple ID でサインインしていて、2 ファクタ認証を使用している実行先を選択します。

  4. 必要に応じて、「署名と機能」ペインの「デバイスを登録」をクリックして、プロビジョニングプロファイルを作成します。

  5. ツールバーで、[Run(実行)] をクリックするか、[Product(製品)] > [Run(実行)] (⌘R)を選択します。


  6. 「Appleでサインイン」ボタンを追加する


    サンプルアプリでは、LoginViewController は、ビュー階層にログインフォームと「Apple でサインイン」ボタン (ASAuthorizationAppleIDButton) を表示します。また、ビューコントローラ自身をボタンのターゲットとして追加し、ボタンがタッチアップイベントを受け取ったときに呼び出されるアクションを渡します。


    func setupProviderLoginView() {
        let authorizationButton = ASAuthorizationAppleIDButton()
        authorizationButton.addTarget(self, action: #selector
          (handleAuthorizationAppleIDButtonPress), for: .touchUpInside)
        self.loginProviderStackView.addArrangedSubview(authorizationButton)
    }
    

    さまざまな Apple プラットフォームで利用可能な「Appleでサインイン」ボタンの詳細については、あなたのアプリに「Apple でサインイン」ボタンを表示する を参照してください。


    重要


    あなたのストーリーボードに「Appleでサインイン」ボタンを追加する場合は、Xcode の Identity Inspector でコントロールのクラス値を ASAuthorizationAppleIDButton に設定しなければなりません。

    Apple ID で認証を要求


    ユーザーが「Apple でサインイン」ボタンをタップすると、ビューコントローラは handleAuthorizationAppleIDButtonPress() 関数を呼び出し、ユーザーのフルネームとメールアドレスの認証要求を実行して、認証フローを開始します。次に、システムはユーザーがデバイス上で Apple ID でサインインしているかどうかを確認します。ユーザーがシステムレベルでサインインしていない場合、アプリはユーザーに「設定」で Apple ID でサインインするよう促すアラートを表示します。


    @objc
    func handleAuthorizationAppleIDButtonPress() {
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        let request = appleIDProvider.createRequest()
        request.requestedScopes = [.fullName, .email]
    
        let authorizationController = ASAuthorizationController(authorizationRequests: [request])
        authorizationController.delegate = self
        authorizationController.presentationContextProvider = self
        authorizationController.performRequests()
    }
    

    重要


    アカウントへのアクセスを安全に保つため、ユーザーは「Apple でサインイン」を使用するには二段階認証を有効にしなければなりません。

    認証コントローラは、ASAuthorizationControllerPresentationContextProviding.presentationAnchor(for:) 関数を呼び出して、アプリからウィンドウを取得し、そのウィンドウ内でモーダルシートとしてユーザーに「Apple でサインイン」コンテンツを表示します。


    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return self.view.window!
    }
    

    ユーザーがシステムレベルで Apple ID でサインインしている場合、Apple でサインイン機能の説明シートが表示され、続いてアカウント情報を編集できる別のシートが表示されます。ユーザーは、氏名(姓と名)を編集したり、連絡先として別のメールアドレスを選択したり、アプリからメールアドレスを非表示にしたりできます。ユーザーがアプリからメールアドレスを非表示にすることを選択した場合、Apple はプロキシメールアドレスを生成し、メールをユーザーのプライベートメールアドレスに転送します。最後に、ユーザーは Apple ID のパスワードを入力し、「続ける」をクリックしてアカウントを作成します。


    ユーザー証明書の処理


    認証が成功すると、認証コントローラーは ASAuthorizationControllerDelegate.authorization
    Controller(controller:didCompleteWithAuthorization:)
    デリゲート関数を呼び出します。アプリはこの関数を使用して、ユーザーのデータをキーチェーンに保存します。


    func authorizationController(controller: ASAuthorizationController,
       didCompleteWithAuthorization authorization: ASAuthorization) {
        switch authorization.credential {
        case let appleIDCredential as ASAuthorizationAppleIDCredential:
    
            // Create an account in your system.
            let userIdentifier = appleIDCredential.user
            let fullName = appleIDCredential.fullName
            let email = appleIDCredential.email
    
            // For the purpose of this demo app, store the `userIdentifier` in the keychain.
            self.saveUserInKeychain(userIdentifier)
    
            // For the purpose of this demo app, show the Apple ID credential information
              in the `ResultViewController`.
            self.showResultViewController(userIdentifier: userIdentifier, fullName: fullName,
               email: email)
    
        case let passwordCredential as ASPasswordCredential:
    
            // Sign in using an existing iCloud Keychain credential.
            let username = passwordCredential.user
            let password = passwordCredential.password
    
            // For the purpose of this demo app, show the password credential as an alert.
            DispatchQueue.main.async {
                self.showPasswordCredentialAlert(username: username, password: password)
            }
    
        default:
            break
        }
    }
    

    注意


    実装においては、ASAuthorizationControllerDelegate.authorizationController(controller
    :didCompleteWithAuthorization:)
    デリゲート関数が、ユーザー識別子に含まれるデータを使用してシステムにアカウントを作成する必要があります。

    認証が失敗した場合、認証コントローラは ASAuthorizationControllerDelegate.authorizationController(controller:
    didCompleteWithError:)
    デリゲート関数を呼び出してエラーを処理します。


    func authorizationController(controller: ASAuthorizationController,
       didCompleteWithError error: Error) {
        // Handle error.
    }
    

    システムがユーザー認証を完了すると、アプリは ResultViewController を表示します。このビューコントローラーには、フレームワークから要求されたユーザー情報(ユーザーが入力したフルネームとメールアドレスなど)が表示されます。また、このビューコントローラーにはサインアウトボタンが表示され、ユーザーデータはキーチェーンに保存されます。ユーザーがサインアウトボタンをタップすると、アプリはビューコントローラーとキーチェーンからユーザー情報を削除し、LoginViewController をユーザーに表示します。



    既存の認証情報を要求


    LoginViewController.performExistingAccountSetupFlows() 関数は、Apple ID と iCloud キーチェーンのパスワードの両方を要求することで、ユーザーが既存のアカウントを持っているかどうかを確認します。handleAuthorizationAppleIDButtonPress() と同様に、認証コントローラは、プレゼンテーションコンテンツプロバイダとデリゲートを LoginViewController オブジェクトに設定します。


    func performExistingAccountSetupFlows() {
        // Prepare requests for both Apple ID and password providers.
        let requests = [ASAuthorizationAppleIDProvider().createRequest(),
                        ASAuthorizationPasswordProvider().createRequest()]
    
        // Create an authorization controller with the given requests.
        let authorizationController = ASAuthorizationController(authorizationRequests: requests)
        authorizationController.delegate = self
        authorizationController.presentationContextProvider = self
        authorizationController.performRequests()
    }
    

    authorizationController(controller:didCompleteWithAuthorization:) デリゲート関数は、認証情報が Apple ID (ASAuthorizationAppleIDCredential) かパスワード認証情報 (ASPasswordCredential) かをチェックします。認証情報がパスワード認証情報の場合、システムは既存のアカウントで認証できるユーザーにアラートを表示します。


    起動時にユーザー認証情報を確認


    サンプルアプリは、必要な場合にのみ「Apple でサインイン」ユーザーインターフェイスを表示します。アプリデリゲートは、AppDelegate.application(_:didFinishLaunchingWithOptions:) 関数内で、起動直後に保存されたユーザー認証情報の状態を確認します。


    ASAuthorizationAppleIDProvider.getCredentialState() 関数は、キーチェーンに保存されているユーザー識別子の状態を取得します。ユーザーがアプリの認証を許可している場合(たとえば、デバイス上で Apple ID を使用してアプリにサインインしている場合)、アプリは実行を続行します。ユーザーがアプリの認証を取り消した場合、またはユーザーの認証情報の状態が見つからない場合は、showLoginViewController() 関数を呼び出してログインフォームを表示します。


    func application(_ application: UIApplication, didFinishLaunchingWithOptions
       launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        appleIDProvider.getCredentialState(forUserID: KeychainItem.currentUserIdentifier)
           { (credentialState, error) in
            switch credentialState {
            case .authorized:
                break // The Apple ID credential is valid.
            case .revoked, .notFound:
                // The Apple ID credential is either revoked or was not found, so show the sign-in UI.
                DispatchQueue.main.async {
                    self.window?.rootViewController?.showLoginViewController()
                }
            default:
                break
            }
        }
        return true
    }
    




    以下も見よ


    Apple でサインイン


    {} tvOS アプリにおけるユーザー認証の簡素化

    AuthenticationServices を使用して、tvOS アプリ向けにスムーズなサインイン体験を構築しましょう。


    struct SignInWithAppleButton

    表示用に「Apple でサインイン」ボタンを作成する SwiftUI ビュー。


    Apple 権限でサインイン

    アプリが「Apple でサインイン」を使用できるようにする権限。


    class ASAuthorizationAppleIDProvider

    Apple ID に基づいてユーザー認証を行うための要求を生成する仕組み。


    class ASAuthorizationAppleIDCredential


    Apple ID 認証が成功した結果として得られる認証情報。














    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ