我需要使用戶 UID 與檔案 ID 相同。
前任:
在 [Authentication] 中,我的用戶具有以下資訊:電子郵件:[email protected] UID:U8EZAjrCWQRvll6CVmI6OpGZwcH3
在 [Firestore 資料庫] 中,我有一個用戶集合。在用戶集合中,我為每個用戶都有一個檔案。
我希望檔案 ID 與用戶 ID 相同。
這可能嗎?
下面是我在 [Authentication] 和 [Firestore database] 用戶集合中創建用戶的片段:
class FirebaseAuthProvider implements AuthProvider {
@override
Future<void> initialize() async {
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
}
@override
Future<AuthUser> createUser({
required String email,
required String password,
}) async {
try {
await FirebaseAuth.instance.createUserWithEmailAndPassword(
email: email,
password: password,
);
final user = currentUser;
if (user != null) {
return user;
} else {
throw UserNotLoggedInAuthException();
}
} on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') {
throw WeakPasswordAuthException();
} else if (e.code == 'email-already-in-use') {
throw EmailAlreadyInUseAuthException();
} else if (e.code == 'invalid-email') {
throw InvalidEmailAuthException();
} else {
throw GenericAuthException();
}
} catch (_) {
throw GenericAuthException();
}
}
}
下面是我的 FirebaseCloudStorage 類
class FirebaseCloudStorage {
final user = FirebaseFirestore.instance.collection('user');
Future<CloudUser> createNewUser({
required String userId,
required String userState,
required String userImage,
required String userFirstName,
required String userLastName,
required String userCellNumber,
required String userCity,
required String userAreaCode,
required String userAddress,
required String userEmail,
}) async {
final document = await user.add({
userIdColumn: userId,
userStateColumn: userState,
userImageColumn: userImage,
userFirstNameColumn: userFirstName,
userLastNameColumn: userLastName,
userCellNumberColumn: userCellNumber,
userCityColumn: userCity,
userAreaCodeColumn: userAreaCode,
userAddressColumn: userAddress,
userEmailColumn: userEmail,
});
final fetchedUser = await document.get();
return CloudUser(
documentId: fetchedUser.id,
userId: userId,
userState: userState,
userImage: userImage,
userFirstName: userFirstName,
userLastName: userLastName,
userCellNumber: userCellNumber,
userCity: userCity,
userAreaCode: userAreaCode,
userAddress: userAddress,
userEmail: userEmail,
);
}
// singleton
static final FirebaseCloudStorage _shared =
FirebaseCloudStorage._sharedInstance();
FirebaseCloudStorage._sharedInstance();
factory FirebaseCloudStorage() => _shared;
}
下面是啟動所有創建的注冊螢屏按鈕
Future createUserAccount() async {
if (_photo == null) return;
try {
setState(() {
_isLoading = true;
});
await AuthService.firebase().createUser(
email: _email.text,
password: _password.text,
// displayName: _userFirstName.text, // not working
);
final userId = AuthService.firebase().currentUser?.id;
final destination = 'user-profile-image/$userId';
final ref = FirebaseStorage.instance.ref(destination);
await ref.putFile(_photo!);
imageUrl = await ref.getDownloadURL();
_userService.createNewUser(
userId: userId as String,
userState: 'new',
userImage: imageUrl as String,
userFirstName: _userFirstName.text,
userLastName: _userLastName.text,
userCellNumber: _userCellphoneNumber.text,
userCity: _userCity.text,
userAreaCode: _userAreaCode.text,
userAddress: _userAddress.text,
userEmail: _email.text,
);
setState(() {
_isLoading = false;
});
AuthService.firebase().sendEmailVerification();
Navigator.of(context).pushNamed(verifyEmailRoute);
} on WeakPasswordAuthException {
await showErrorDialog(
context,
'Weak password',
);
} on EmailAlreadyInUseAuthException {
await showErrorDialog(
context,
'Email is already in use',
);
} on InvalidEmailAuthException {
await showErrorDialog(
context,
'This is an invalid email address',
);
} on GenericAuthException {
await showErrorDialog(
context,
'Failed to register',
);
}
}
uj5u.com熱心網友回復:
您可以通過使用set而不是add并指定已經存在的用戶識別符號來為檔案使用自定義 ID。因此,在您的createNewUser功能中,您可以這樣做:
final document = await user.doc(userId).set({
userIdColumn: userId,
userStateColumn: userState,
userImageColumn: userImage,
userFirstNameColumn: userFirstName,
userLastNameColumn: userLastName,
userCellNumberColumn: userCellNumber,
userCityColumn: userCity,
userAreaCodeColumn: userAreaCode,
userAddressColumn: userAddress,
userEmailColumn: userEmail,
});
注意:從服務器端的受信任環境而不是客戶端維護您自己的用戶集合可能是一個更好的解決方案。例如,您可以使用 Firebase 身份驗證觸發器在發生更改時添加/洗掉/修改用戶資料,例如注冊新用戶。這樣您就不必允許從客戶端對您的用戶集合進行寫操作。
uj5u.com熱心網友回復:
您可以在身份驗證事件上使用 onCreate 觸發器。
如果您使用云功能,則可以在創建新的身份驗證條目時使用以下代碼在用戶集合中創建新檔案:
export const createUser = functions.auth
.user()
.onCreate(async (user) => {
// DataObject includes all the data, which should be stored in firestore
const dataObject = {
email: user.email,
};
await dbFirestore
.collection('users')
.doc(user.uid)
.set(dataObject, {merge: true});
});
有關觸發器的資訊:https ://firebase.google.com/docs/functions/auth-events
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516002.html
