Итак, я делаю простые экраны регистрации и входа в приложение flutter, которое использует телефонную аутентификацию firebase. Для регистрации я могу зарегистрировать нового пользователя, так как пользователь предоставляет свой номер телефона и получает OTP. Но для входа в систему я хочу проверить, зарегистрирован ли уже введенный номер. Если это так, он получает otp и входит в систему, а если не зарегистрирован, то сначала просит зарегистрироваться.
Как проверить, зарегистрирован ли номер телефона в аутентификации firebase с помощью flutter
Ответы (2)
SDK администратора Firebase поддерживает это. Вот как настроить администратора firebase (документация). После настройки администратора вы можете использовать пакет cloud_functions для вызова API из административного SDK firebase и API. мы будем использовать тот, который позволяет нам получить пользователя по номеру телефона (документация). Если ответ API - это запись пользователя, мы знаем, что телефон существует.
В этом примере я использую node.js. В functions / index.js:
exports.checkIfPhoneExists = functions.https.onCall((data, context) => {
const phone = data.phone
return admin.auth().getUserByPhoneNumber(phone)
.then(function(userRecord){
return true;
})
.catch(function(error) {
return false;
});
});
В вашем коде дротика:
final HttpsCallable callable = CloudFunctions.instance.getHttpsCallable(functionName: 'checkIfPhoneExists');
dynamic resp = await callable.call({'phone': _phone});
if (resp.data) {
// user exists
}
После отправки OTP пользователю вы можете проверить, является ли пользователь новым или уже существующим, в функции проверки OTP.
verifyOtp(String input, context) async {
String retVal = "error";
OurUser _user = OurUser();
print(input);
final AuthCredential credential = PhoneAuthProvider.credential(
verificationId: _verificationId, smsCode: input);
try {
// await _auth.signInWithCredential(credential);
UserCredential _authResult = await _auth.signInWithCredential(credential);
// Here i have to save the details of the user in the database
if (_authResult.additionalUserInfo.isNewUser) {
currentUser.uid = _authResult.user.uid;
currentUser.phone = _inputText;
currentUser.type = "Customer";
retVal = await OurDatabase().createUser(currentUser);
} else {
// get the information of the user from the database this already exists
currentUser = await OurDatabase().getUserInfo(_authResult.user.uid);
if(currentUser!= null) {
Navigator.pushNamedAndRemoveUntil(
context, "/homescreen", (route) => false);
}
}
print("End of the await");
// when signup with the otp
if (retVal == "success") {
print("why not inside this mane");
Navigator.pushNamedAndRemoveUntil(
context, "/homescreen", (route) => false);
}
saveAllData();
} catch (e) {
print(e);
print("Something went wrong");
//prin
}
}
Теперь это когда вы хотите проверить OTP от пользователя, и после проверки верхней части вы можете узнать, действительно ли пользователь был новым пользователем или старым, но что, если вы хотите знать это заранее, тогда лучшим возможным решением будет создать новую коллекцию в firestore, в которой будет только один документ (так что вы платите только за один прочитанный документ), который будет содержать только все номера пользователей, зарегистрированных в вашем приложении,