uni-app 重置密码 "该链接有效期为20分钟" 无效 即超过20分钟也可以正常重置

uni-app 重置密码 “该链接有效期为20分钟” 无效 即超过20分钟也可以正常重置

产品分类:
其他/ASK社区

App下载地址或H5网址:
https://account.dcloud.net.cn/user/reset/

操作步骤:

hbuilderx.请求(重置密码('邮箱')).之后(() => {  
    let 邮箱 = 登录邮箱('邮箱账号', '邮箱密码');  
    let 一堆邮件 = 邮箱.得到未读邮件();  
    let 找回密码的邮件 = 一堆邮件.查找(标题 = 'HBuilder开发者帐号找回密码邮件');  
    let 链接 = 找回密码的邮件.正则匹配('/https\:\/\/account\.dcloud\.net\.cn\/user\/reset\/.*');  
    setTimeout(() => {  
        let 页面 = 访问(链接);  
        if (页面.是否已过期) return false;  
        页面.输入密码('123456');  
        页面.再次输入密码('123456');  
        页面.点击提交按钮();  
        hbuilderx.登录('账号', '123456');  
        return(登录.状态 == '成功');  
    }, 4天);  
});

预期结果:

false

实际结果:

true

bug描述:

(实在不知道分区应该怎么选了)

“该链接有效期为20分钟” 异常:

我于 2022/5/7 10:58 发出重置密码请求但我很快就忘了这件事

直到刚刚我查看垃圾邮件时发现了之前请求重置密码的邮件 (图一)

但当我点击邮件中的地址时, 它仍可正常访问, 并修改密码 (图二, 2022/5/11 23:04)
(修改密码后链接才无法访问)

(注意图中邮件的时间!!!)

图片

Image 1
Image 2


更多关于uni-app 重置密码 "该链接有效期为20分钟" 无效 即超过20分钟也可以正常重置的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 重置密码 "该链接有效期为20分钟" 无效 即超过20分钟也可以正常重置的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中实现重置密码功能时,如果发现“该链接有效期为20分钟”的验证无效,即超过20分钟仍然可以正常重置密码,可能是由于以下几个原因导致的:

1. 时间戳验证逻辑未正确实现

你可能在生成重置密码链接时生成了一个时间戳,并在用户点击链接时检查该时间戳是否在有效期内。如果时间戳的验证逻辑没有正确实现,可能会导致链接始终有效。

解决方案: 确保在生成链接时记录当前时间戳,并在用户点击链接时计算当前时间与生成时间戳的差值,判断是否超过20分钟。

// 生成重置密码链接时记录时间戳
const timestamp = Date.now();
const resetLink = `https://yourdomain.com/reset-password?token=${token}&timestamp=${timestamp}`;

// 用户点击链接时验证时间戳
const currentTime = Date.now();
const linkTime = parseInt(query.timestamp); // 从URL中获取时间戳
if (currentTime - linkTime > 20 * 60 * 1000) {
    // 链接已过期
    alert("该链接已过期,请重新申请重置密码。");
    return;
}

2. 服务器端未正确验证时间戳

如果你在服务器端处理重置密码请求,确保服务器端也进行了时间戳的验证。客户端的时间戳可以被篡改,因此服务器端的验证是必要的。

解决方案: 在服务器端接收到重置密码请求时,检查时间戳是否在有效期内。

// 服务器端验证时间戳
const currentTime = Date.now();
const linkTime = parseInt(req.query.timestamp); // 从请求中获取时间戳
if (currentTime - linkTime > 20 * 60 * 1000) {
    // 链接已过期
    res.status(400).send("该链接已过期,请重新申请重置密码。");
    return;
}

3. 缓存或本地存储问题

如果你在客户端缓存了重置密码的令牌或时间戳,可能会导致即使链接过期,客户端仍然可以使用缓存的令牌进行重置。

解决方案: 确保每次重置密码时都从服务器获取最新的令牌和时间戳,并避免在客户端缓存这些信息。

4. 前端路由或页面刷新问题

如果用户在点击重置密码链接后刷新页面或通过其他方式重新进入页面,可能会导致时间戳验证逻辑失效。

解决方案: 确保在页面加载时重新获取时间戳并进行验证,而不是依赖于之前的状态。

onLoad(query) {
    const currentTime = Date.now();
    const linkTime = parseInt(query.timestamp); // 从URL中获取时间戳
    if (currentTime - linkTime > 20 * 60 * 1000) {
        // 链接已过期
        uni.showToast({
            title: "该链接已过期,请重新申请重置密码。",
            icon: "none"
        });
        return;
    }
}

5. 时区问题

如果服务器和客户端处于不同的时区,可能会导致时间戳计算出现偏差。

解决方案: 确保服务器和客户端使用相同的时间标准(如UTC时间),并在计算时间差时考虑时区问题。

const currentTime = new Date().getTime(); // 使用UTC时间
const linkTime = parseInt(query.timestamp); // 从URL中获取时间戳
if (currentTime - linkTime > 20 * 60 * 1000) {
    // 链接已过期
    alert("该链接已过期,请重新申请重置密码。");
    return;
}

6. 调试和日志

如果以上方法都无法解决问题,建议在代码中添加调试信息,记录时间戳的生成和验证过程,以便更好地定位问题。

console.log("生成链接时间戳:", timestamp);
console.log("当前时间:", currentTime);
console.log("时间差:", currentTime - linkTime);
回到顶部