我正在react-redux中创建一个表单来更改用户密码。我想知道如何验证用户当前密码才能更改为新密码。 在我的表单中,我有2个字段:旧密码,新密码。
这是我的动作:
const { currentUser } = auth
currentUser.updatePassword(newPassword)
.then(
success => {
dispatch({
type: CHANGE_USER_PASSWORD_SUCCESS,
payload: currentUser
})
},
error => {
dispatch({
type: CHANGE_USER_PASSWORD_FAIL,
error: error.message
})
}
)
我想知道,如何在Firebase中验证旧密码?我应该使用signInWithEmailAndPassword()吗?或者,由于我的用户已经登录,是否存在无需再次调用登录即可验证当前密码的功能? 谢谢
答案 0 :(得分:4)
好吧,我相信您希望用户输入旧密码只是为了验证它是否是该帐户的实际所有者。
Firebase可以很好地处理这种情况,您只需要在用户对象上调用updatePassword方法并输入新密码即可。
const changePassword = async newPassword => {
const user = firebase.auth().currentUser;
try {
await user.updatePassword(newPassword)
console.log('Password Updated!')
} catch (err) {
console.log(err)
}
}
如果用户上次登录已经有一段时间了,那么Firebase将返回一个错误- “此操作很敏感,需要最近的身份验证。请重试此请求之前登录。”
因此,您真的不需要检查旧密码,因为firebase会为您提供密码。
但是,如果您只想一次完成操作,而无需用户再次登录。 还有一种方法。
在用户对象reauthenticateAndRetrieveDataWithCredential
上有一个方法,您只需要传递一个带凭据的对象(电子邮件和密码)即可刷新身份验证令牌。
const reauthenticate = currentPassword => {
const user = firebase.auth().currentUser;
const cred = firebase.auth.EmailAuthProvider.credential(
user.email, currentPassword);
return user.reauthenticateAndRetrieveDataWithCredential(cred);
}
在您的特定情况下,您可以拥有类似的内容
const changePassword = async (oldPassword, newPassword) => {
const user = firebase.auth().currentUser
try {
// reauthenticating
await this.reauthenticate(oldPassword)
// updating password
await user.updatePassword(newPassword)
} catch(err){
console.log(err)
}
}
了解有关Firebase重新认证的更多信息-https://firebase.google.com/docs/auth/web/manage-users#re-authenticate_a_user
希望有帮助