0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[iOS] Firebase Authenticationで匿名認証してからAppleIDと紐付ける方法

Posted at

iOSアプリでは初回登録時にログインを必須にするとリジェクトされてしまい、初回ユーザーはログインなしで使ってもらうようにする必要がでることがあります。

これについてはFirebaseの匿名認証を使うことで対応できます。

ただこれだけだと機種変時にデータが受け継がれないので、あとでなんらかのアカウントと紐づけできるようにしておく必要があります。ここではAppleIDでの連携について説明します。

環境

  • Xcode14
  • Firebase 10.14.0

匿名認証

公式ドキュメント:Apple プラットフォームで Firebase 匿名認証を行う

Firebaseコンソール側

  • Firebase コンソールの [Authentication] セクションで、[Sign-in method] のタブを開きます。
  • [匿名] を有効にして、[保存] をクリックします。

image.png

コード側

すでにユーザー作成済みかどうかチェックして、未作成の場合に匿名でユーザーログインします。

import FirebaseAuth

func createUser() async throws {
    let user = Auth.auth().currentUser
    if user == nil {
        let result = try await Auth.auth().signInAnonymously()
        print(result.user.uid)
    } else {
        throw SomethingError()
    }
}

AppleIDログインとの紐づけ

公式ドキュメント:「Apple でサインイン」して Firebase で認証する

公式ドキュメント:匿名アカウントを永久アカウントに変換する

// SignIn with Appleボタンを押してログイン
SignInWithAppleButton(.signIn) { request in
    request.requestedScopes = []
    let nonce = randomNonceString()
    request.nonce = sha256(nonce)
} onCompletion: { result in
    switch result {
    case .success(let authResults):
        // credentialを取得
        let appleIDCredential = authResults.credential as? ASAuthorizationAppleIDCredential

        guard let appleIDToken = appleIDCredential?.identityToken else {
            fatalError()
        }
        // utf8でエンコーディングする
        guard let idTokenString = String(data: appleIDToken, encoding: .utf8) else {
            print("Unable to serialize token string from data: \(appleIDToken.debugDescription)")
            fatalError()
        }

        // 今のログインユーザーとAppleIDログインを紐付ける
        Task {
            let credential = OAuthProvider.appleCredential(withIDToken: idTokenString,rawNonce: nonce)
            do {
                try await Auth.auth().currentUser?.link(with: credential)
                print("success")
            } catch {
                print("error")
            }
        }
    case .failure(let error):
        print("Authentication failed: \(error.localizedDescription)")
    }
}
0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?