Firebase:登录前可以知道“ ERROR_INVALID_EMAIL”的规则吗?

时间:2019-06-11 05:37:24

标签: firebase

我在本地检查中为regex实现了email format, 然后调用firebase登录/注册api,它返回ERROR_INVALID_EMAIL,这意味着我提供的电子邮件格式未在firebase服务器中传递。

我当前使用的电子邮件正则表达式规则来自一家酒吧validatorscode

我的测试简单电子邮件仅为aaa@aaa.a

RegExp _email = new RegExp(
    r"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$");
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:validators/validators.dart';

class AuthState extends ChangeNotifier {
  AuthState();

  // NOTE: maybe need to use FirebaseApp(appName) to replace default.
  final _auth = FirebaseAuth.instance;

  User _userFromFirebase(FirebaseUser user, {bool isJustSignUp = false}) {
    if (user == null) {
      return null;
    }
    return User(
      user.email,
      imgUrl: '',
    );
  }

  Future<User> getUser() async {
    var user = await _auth.currentUser();
    debugPrint('[+] -- $runtimeType: getUser:$user}');
    return _userFromFirebase(user);
  }

  Future<User> signInWithEmailPassword(String email, String password) async {
    try {
      FirebaseUser user = await _auth.signInWithEmailAndPassword(
        email: email,
        password: password,
      );
      return _userFromFirebase(user);
    } catch (error, stackTrace) {
      debugPrint(
          '[+] -- $runtimeType: signInWithEmailPassword: error:$error, stackTrace:$stackTrace');
      if (error.code == 'ERROR_USER_NOT_FOUND') {
        // Login with email not found: to signUp with email password.
        return _signUpWithEmailPassword(email, password);
      }
    }
  }

  Future<User> _signUpWithEmailPassword(String email, String password) async {
    try {
      FirebaseUser user = await _auth.createUserWithEmailAndPassword(
        email: email,
        password: password,
      );
      return _userFromFirebase(user, isJustSignUp: true);
    } catch (error, stackTrace) {
      debugPrint('error:$error, stackTrace:$stackTrace');
    }
  }

  bool emailValidation(String email) {
    if (email.isNotEmpty) {
      if (email.length > 30) {
        // assuem email length more then 30 will give false.
        return false;
      }
      return isEmail(email);
    }
    return false;
  }
}

class User {
  const User(
    this.email,{
    this.imgUrl ='',
  });

  final String email;
  final String imgUrl;
}

我想做的就是在用户点击登录之前收到此错误, 那可能吗 ?

  • 我只是无法通过文字或正则表达式找到规则。
  • 还是有一种方法可以仅针对Firebase API检查电子邮件?

1 个答案:

答案 0 :(得分:0)

正如我们在评论中所讨论的,我们在电子邮件地址末尾的最后一个点之后需要两个字符,以与Firebase电子邮件有效格式匹配。为此,请将您的正则表达式更改为

^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$