如何在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>
)
}
}
答案 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.
}
})
我敢肯定有一个适当的解决方案,当我找到它时,我将更新此答案。
希望这会对某人有所帮助