📁

ゲストログインからリンク(登録)する機能の実装

2024/05/26に公開

はじめに

ゲストでログイン機能を実装したのでついでにゲストログインからリンク(登録)できるようにしました。

実装したいこと

  • ➀ゲストログインでログイン
    • ユーザデータ(createdAt,uid,userName,email)の追加
    • ゲストでログイン
    • 画面遷移
  • ➁リンクさせる
    • リンク
    • ユーザデータ変更
    • 画面遷移

【参考公式URL】
・※Authenticate with Firebase Anonymously
https://firebase.google.com/docs/auth/flutter/anonymous-auth

行ったこと

https://zenn.dev/raikun/articles/4aff4d5cf598d8

➀の実装

  Future<void> signInAnonymouslyAndSaveUser(
      {required BuildContext context, String? email, String? name}) async {
    final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
    final FirestoreUser firestoreUser =
        _createFirestoreUser(email: email, name: name);
    final Map<String, dynamic> userData = firestoreUser.toJson();

    try {
      //匿名ログイン
      final userCredential = await firebaseAuth.signInAnonymously();
      final User? user = userCredential.user;

      // ユーザデータの追加
      if (user != null) {
        await FirebaseFirestore.instance
            .collection('users')
            .doc(user.uid)
            .set(userData);
      }

      //画面遷移
      await _navigateToMainPage(context);

    } on FirebaseAuthException catch (e) {
       await _showErrorDialog(context, e.toString());
    }
  }

  FirestoreUser _createFirestoreUser({String? email, String? name}) {
    final Timestamp now = Timestamp.now();
    const uuid = Uuid();
    final uid = uuid.v4();
    //デフォルト値を使う
    return FirestoreUser(
      createAt: now,
      email: email ?? '未設定',
      updatedAt: now,
      uid: uid,
      userName: name ?? '匿名ユーザー',
    );
  }
    

➁の実装。


  Future<void> linkUserAccount(
      BuildContext context, String email, String password, String name) async {
    try {
      // Emailとpasswordを登録
      final credential =
          EmailAuthProvider.credential(email: email, password: password);
      //linkWithCredentialが成功したら、リンク完了
      final userCredential = await FirebaseAuth.instance.currentUser
          ?.linkWithCredential(credential);
      final User? user = userCredential?.user;

      if (user == null) {
        throw FirebaseAuthException(
          code: 'user-not-found',
          message: 'User not found after linking.',
        );
      }
      final String uid = user.uid;

      //ユーザデータ変更
      await createFirestoreUser(
        uid: uid,
        email: email,
        name: name,
      );

      //画面遷移
      await _navigateToMainPage(context);
    } on FirebaseAuthException catch (e) {
      print('${e.code}, ${e.message}');
    }
  }

Discussion