Firebase检测用户是否存在

时间:2017-06-18 14:05:47

标签: javascript firebase react-native firebase-authentication

如何在Signup按钮中通过反应本地检查Firebase身份验证中是否存在用户?

这是我的登录页码:

export default class Login extends Component {
    constructor(props) {
        super(props)
        this.state = {
            email: '',
            password: '',
            response: ''
        }
        this.signUp = this.signUp.bind(this)
        this.login = this.login.bind(this)
    }

    async signUp() {
        try {
            await firebase.auth().createUserWithEmailAndPassword(this.state.email, this.state.password)
            this.setState({
                response: 'Account Created!'
            })
            setTimeout(() => {
                this.props.navigator.push({
                    id: 'App'
                })
            }, 500)
        } catch (error) {
            this.setState({
                response: error.toString()
            })
        }
    }
    async login() {
        try {
            await firebase.auth().signInWithEmailAndPassword(this.state.email, this.state.password)
            this.setState({
                response: 'user login in'
            })

            setTimeout(() => {
                this.props.navigator.push({
                    id: 'App'
                })
            })

        } catch (error) {
            this.setState({
                response: error.toString()
            })
        }
    }

    render() {
        return (
            <View style={styles.container}>
                <View style={styles.containerInputes}>
                    <TextInput
                        placeholderTextColor="gray"
                        placeholder="Email"
                        style={styles.inputText}
                        onChangeText={(email) => this.setState({ email })}
                    />
                    <TextInput
                        placeholderTextColor="gray"
                        placeholder="Password"
                        style={styles.inputText}
                        password={true}
                        secureTextEntry={true}
                        onChangeText={(password) => this.setState({ password })}
                    />
                </View>
                <TouchableHighlight
                    onPress={this.login}
                    style={[styles.loginButton, styles.button]}
                >
                    <Text
                        style={styles.textButton}
                    >Login</Text>
                </TouchableHighlight>
                <TouchableHighlight
                    onPress={this.signUp}
                    style={[styles.loginButton, styles.button]}
                >
                    <Text
                        style={styles.textButton}
                    >Signup</Text>
                </TouchableHighlight>
            </View>
        )
    }
}

4 个答案:

答案 0 :(得分:12)

您需要使用fetchProvidersForEmail API。它需要一封电子邮件并返回一个承诺,该承诺通过链接到该电子邮件的提供商列表进行解析(如果已经注册): https://firebase.google.com/docs/reference/js/firebase.auth.Auth#fetchProvidersForEmail

答案 1 :(得分:3)

很简单。 在signUp函数中将then()和catch()添加到firebase方法。

firebase.auth().createUserWithEmailAndPassword(this.state.email, this.state.password)
.then(()=>{
    console.log('Signup successful.');
    this.setState({
            response: 'Account Created!'
        })
   })
.catch((error)=> {
    console.log(error.code);
    console.log(error.message);
  });

有关不同错误代码的信息:

  • AUTH /电子邮件已经在使用

    如果已存在具有给定电子邮件地址的帐户,则抛出该文件。

  • AUTH /无效的电子邮件

    如果电子邮件地址无效,则抛出。

  • AUTH /操作不被允许

    如果未启用电子邮件/密码帐户,则抛出此异常。在“身份验证”选项卡下的Firebase控制台中启用电子邮件/密码帐户。

  • AUTH /弱密码

    如果密码不够强,则抛出。

答案 2 :(得分:3)

以下是使用fetchSignInMethodsForEmail API的方法。它返回一个数组。如果该数组为空,则表示该用户从未使用您在应用中使用过的登录方法来登录/登录过您的应用。

这是Google登录的示例。

firebase
    .auth()
    .signInWithPopup(provider)
    .then((result) => {
        let token = result.credential.accessToken;
        let user = result.user;

        firebase
            .auth()
            .fetchSignInMethodsForEmail(user.email)
            .then((result) => {
                console.log('result', result);
            });
        })
        .catch((error) => {
            // Handle Errors here.
        }

答案 3 :(得分:2)

对我来说fetchSignInMethodsForEmail()仅适用于使用电子邮件/密码注册的电子邮件,不适用于通过Apple,LinkedIn或其他提供商注册的电子邮件。

为此,我想出了以下解决方法:

auth().signInWithEmailAndPassword(email, 'some-random-password')  // Password should be really long to avoid actually logging in :)
.then((response) => {
    // TODO : Avoid this block
})
.catch((error) => {
    if(error.code === 'auth/wrong-password'){
        // TODO : If here then it means account already exists...
    }

    if(error.code === 'auth/user-not-found'){
        // TODO : If here then you guessed it... you can create a new account.
    }
})

我敢肯定有一个适当的解决方案,当我找到它时,我将更新此答案。

希望这会对某人有所帮助