![](/img/trans.png)
[英]Firebase user signup with email and send them password via email
[英]Resetting password via email
很抱歉,我正在嘗試通過 email 重置密碼,直到現在我設法將重置鏈接發送到 email,現在我在后端嘗試了這個:
userRouter.get('/reset', expressAsyncHandler(async (req, res) => {
const user = await User.findOne({
where: {
resetPasswordToken: req.query.resetPasswordToken,
resetPasswordExpires: {
$gt: Date.now(),
},
},
});
if (user) {
console.log('token matched')
res.status(200).send({
message: 'password reset link ok'
})
} else {
console.log('password reset link is invalid or has expired');
res.json('password reset link is invalid or has expired');
}
})
);
在忘記密碼中,我做了這樣的事情來更新兩個字段:
user.update({
resetPasswordToken: token,
resetPasswordExpires: Date.now() + 360000,
});
我的用戶 Model 是:
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
isAdmin: { type: Boolean, default: false, required: true }
當我嘗試使用 where 子句檢查 resetPasswordToken 是否返回我的所有用戶時,這是錯誤的。 我在想我需要在 model 中聲明 resetPasswordToken 和 resetPasswordExpires 以實現這兩項工作? 還是足夠了? 另一個問題是,我必須將什么發送到前端才能正常工作?
在 react-redux 中,我有以下 function,但我是 100%,我發送了錯誤的數據:
export const checktoken = (email) => async (dispatch) => {
dispatch({ type: USER_RESET_PASSWORD_REQUEST, payload: { email } });
try {
const { data } = await Axios.get('/api/users/reset');
dispatch({ type: USER_RESET_PASSWORD_SUCCESS, payload: data });;
localStorage.setItem('userInfo', JSON.stringify(data));
} catch (error) {
dispatch({
type: USER_RESET_PASSWORD_FAIL,
payload:
error.response && error.response.data.message
? error.response.data.message
: error.message,
});
}
};
首先,您的 model 沒有字段resetPasswordToken
和resetPasswordExpires
。 這意味着您的update
將不起作用。 我假設您使用的是 mongoose,並且 mongoose 不會更新 model 中不存在的字段。
添加條目如下。
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
isAdmin: { type: Boolean, default: false, required: true },
resetPasswordToken: { type: String },
resetPasswordExpires: { type: Number }
其次,您的查詢是錯誤的。 查詢應該像...
const user = await User.findOne({
resetPasswordToken: req.query.resetPasswordToken,
resetPasswordExpires: {
$gt: Date.now(),
},
});
注意:始終檢查您的數據庫以查看您的update
條目是否確實已更新。
在驗證用戶 + 令牌存在后,您可以將res.status(200).send()
發送到您的 web 應用程序。
然后,在您的 web 應用程序中,您將要求用戶輸入新密碼。 用戶輸入新密碼后,您將(再次)將新密碼和令牌發送到后端。
這次,您需要再次驗證令牌,然后才能將密碼更新為用戶 model。 這將確保重置密碼來自有效來源。
一旦密碼更新,您可能希望從文檔中刪除 resetPasswordToken 和 resetPasswordExpires,因為它不再需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.