繁体   English   中英

如何让 Firebase 用户在 google 登录功能之外颤抖?

[英]How to make Firebase user in flutter outside the google sign in function?

我制作了一个应用程序,您可以在其中使用 Google 帐户登录,并且我想要一个变量来存储用户是否登录并将其上传到 Firestore。 但是要使用更新数据功能,我需要传入一个用户对象,该对象仅在google登录功能中可用。 那么如何让谷歌之外的用户登录呢?

import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:rxdart/rxdart.dart';

class AuthService {
  final GoogleSignIn _googleSignIn = GoogleSignIn();
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final Firestore _db = Firestore.instance;

  bool loggedIn = false;

  Observable<FirebaseUser> user; //firebase user
  Observable<Map<String, dynamic>> profile; //custom user data in Firestore
  PublishSubject loading = PublishSubject();

  //constructor
  AuthService() {
    user = Observable(_auth.onAuthStateChanged);
    profile = user.switchMap((FirebaseUser u) {
      if (u != null) {
        return _db.collection('users').document(u.uid).snapshots().map((
            snap) => snap.data);
      } else {
        return Observable.just({});
      }
    });
  }


  Future<String> testSignInWithGoogle() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;
    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    final FirebaseUser user = (await _auth.signInWithCredential(credential))
        .user;
    assert(user.email != null);
    assert(user.displayName != null);
    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);


    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    loggedIn = true;

    updateUserData(user);

    return 'signInWithGoogle succeeded: $user';
  }

  void updateUserData(FirebaseUser user) async {
    DocumentReference ref = _db.collection('users').document(user.uid);

    //loggedIn = true;

    return ref.setData({
      'uid': user.uid,
      'email': user.email,
      'photoURL': user.photoUrl,
      'displayName': user.displayName,
      'lastSeen': DateTime.now(),
      'loggedIn': loggedIn,
    }, merge: true);
  }

  void signOut() {
    _auth.signOut();
    loggedIn = false;
  }
}

final AuthService authService = AuthService();

如果我理解你的问题,你想操纵 Firebase 用户。 您可以使用多种方法创建 Firebase 用户,而不仅仅是 GoogleSignIn 的一种。 之后,您可以使用firebase_auth包中的一系列方法更新用户。

下面是几个简单的例子:

FirebaseUser _firebaseUser;
FirebaseAuth _auth = FirebaseAuth.instance;

void registerFirebaseUser(String email, String password){
  _auth.createUserWithEmailAndPassword(
    email: email,
    password: password
  ).then((AuthResult authResult) {
    _firebaseUser = authResult.user;
  });
}

void updateFirebaseUsername(String username) {
  UserUpdateInfo userUpdateInfo = UserUpdateInfo();
  userUpdateInfo.displayName = username;

  _firebaseUser.updateProfile(userUpdateInfo);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM