微信小程序如何實現通過郵箱驗證修改密碼功能

? ? ? ? 基于騰訊云開發(Tencent Cloud Base)實現小程序郵箱驗證找回密碼功能的完整邏輯說明及關鍵代碼實現。結合安全性和開發效率,方案采用 ??云函數 + 小程序前端?? 的架構,使用 ??Nodemailer?? 發送郵件。Nodemailer 是一個專為 Node.js 設計的開源郵件發送庫,用于在服務端高效、靈活地處理電子郵件發送任務。它通過簡化郵件傳輸協議(如 SMTP)的復雜性,為開發者提供了強大的郵件管理能力。

一、實現原理

用“快遞站”比喻來解釋這個流程:?

  1. ??快遞站代發包裹(系統統一發驗證碼)??
    公司搭了個快遞站(系統郵箱),專門代發驗證碼“包裹”。用戶填個收件地址(郵箱),站長立刻打包發出📮。

  2. ??用戶只管收件(注冊流程)??
    用戶啥也不用干,留完地址就坐等收件。拆開包裹填個驗證碼,立馬進門(完成驗證)?。

  3. ??站長領把鑰匙(管理員配一次)??
    給快遞站申請個專屬鑰匙(獲取QQ郵箱授權碼)🔑;把鑰匙存進公司保險柜(更新數據庫)。?從此站長隨時能開門發件,永不失效!

二、功能邏輯流程圖如下所示:

三、JavaScript代碼

Page({data: {account: '',email: '',code: '',newPassword: ''},// 輸入綁定onAccountInput(e) { this.setData({ account: e.detail.value }); },onEmailInput(e) { this.setData({ email: e.detail.value }); },onCodeInput(e) { this.setData({ code: e.detail.value }); },onPwdInput(e) { this.setData({ newPassword: e.detail.value }); },// 發送驗證碼async sendCode() {const { account, email } = this.data;try {const res = await wx.cloud.callFunction({name: 'sendEmailCode',data: { account, email }});wx.showToast({ title: '驗證碼已發送至郵箱' });} catch (err) {wx.showToast({ title: '發送失敗', icon: 'error' });}},// 重置密碼async resetPassword() {const { account, email, code, newPassword } = this.data;try {await wx.cloud.callFunction({name: 'verifyCodeAndReset',data: { account, email, code, newPassword }});wx.showToast({ title: '密碼重置成功' });} catch (err) {wx.showToast({ title: '驗證碼錯誤或已過期', icon: 'error' });}}
});

四、云函數實現(Node.js)

1. 發送驗證碼云函數 (sendEmailCode)
const cloud = require('wx-server-sdk');
const nodemailer = require('nodemailer');
cloud.init();// 配置QQ郵箱(需開啟SMTP并獲取授權碼)
const transporter = nodemailer.createTransport({host: 'smtp.qq.com',port: 465,secure: true,auth: {user: 'your_email@qq.com', // 發件郵箱pass: 'your_authorization_code' // QQ郵箱授權碼}
});exports.main = async (event) => {const { account, email } = event;const db = cloud.database();// 校驗賬號和郵箱是否匹配const user = await db.collection('users').where({account,email}).get();if (user.data.length === 0) {throw new Error('賬號或郵箱不匹配');}// 生成6位隨機驗證碼const code = Math.random().toString().slice(2, 8);// 存儲驗證碼(有效期5分鐘)await db.collection('verificationCodes').add({data: {account,code,email,createdAt: new Date()}});// 發送郵件const mailOptions = {from: 'your_email@qq.com',to: email,subject: '密碼重置驗證碼',html: `<p>您的驗證碼是:<b>${code}</b>,5分鐘內有效</p>`};await transporter.sendMail(mailOptions);return { success: true };
};

2.驗證并重置密碼云函數 (verifyCodeAndReset)

exports.main = async (event) => {const { account, email, code, newPassword } = event;const db = cloud.database();const now = new Date();// 查詢有效驗證碼(5分鐘內)const codeRecord = await db.collection('verificationCodes').where({account,email,code}).orderBy('createdAt', 'desc').get();// 驗證碼校驗if (codeRecord.data.length === 0 || now - codeRecord.data[0].createdAt > 5 * 60 * 1000) {throw new Error('驗證碼錯誤或已過期');}// 更新密碼(需加密存儲)const hashedPassword = require('crypto').createHash('md5').update(newPassword).digest('hex');await db.collection('users').where({ account }).update({data: { password: hashedPassword }});// 刪除已用驗證碼await db.collection('verificationCodes').doc(codeRecord.data[0]._id).remove();return { success: true };
};

3.在數據庫創建systemConfig集合

{"type": "email","email": "your_email@qq.com",      // 完整的QQ郵箱地址"host": "smtp.qq.com",            // SMTP服務器地址"port": 465,                      // 必須為465端口"authCode": "your_16_digit_code", // 從QQ郵箱設置獲取的16位授權碼"service": "QQ",                  // 服務標識(可選)"senderName": "系統通知",          // 發件人顯示名稱(可選)"secure": true                    // 啟用SSL加密傳輸
}

五、安全增強建議

  1. ??郵箱授權碼管理??:將授權碼存入騰訊云??環境變量??(process.env.EMAIL_AUTH_CODE),避免硬編碼。
  2. ??驗證碼時效性?:數據庫存儲驗證碼時記錄時間戳,校驗時檢查是否超過5分鐘。
  3. ??防刷機制?:限制同一郵箱/賬號的發送頻率(如1分鐘1次),可在云函數中增加頻率校驗邏輯。
  4. ??密碼加密?:使用 ??MD5/SHA256?? 對新密碼加密存儲(示例中使用了MD5)。

?六、注意事項

  1. ??QQ郵箱配置??
    • 需登錄QQ郵箱網頁版 → 設置 → 賬戶 → 開啟 ??SMTP服務?? → 獲取16位授權碼。
  2. ??云函數依賴安裝??
    • 在云函數目錄下執行?npm install nodemailer?安裝郵件模塊。
  3. ??真機測試??
    • 微信開發者工具中可能無法調用云函數發送郵件,需使用真機測試。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88994.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# VB.NET中Tuple輕量級數據結構和固定長度數組

C# VB.NET取字符串中全角字符數量和半角字符數量-CSDN博客 https://blog.csdn.net/xiaoyao961/article/details/148871910 在VB.NET中&#xff0c;使用Tuple和固定長度數組在性能上有細微差異&#xff0c;以下是詳細分析&#xff1a; 性能對比測試 通過測試 100 萬次調用&am…

建筑物年代預測與空間異質性分析解決方案

建筑物年代預測與空間異質性分析解決方案 1. 問題分析與創新點設計 核心任務:預測建筑物建造年代,并分析空間異質性對預測的影響 創新點設計: 空間權重矩陣集成:構建空間鄰接矩陣量化地理鄰近效應多尺度特征提取:融合建筑物微觀特征與街區宏觀特征異質性分區建模:基于…

FOUPK3system5XOS

Foupk3systemX5OS系統19.60內測版&#xff08;X9&#xff09;2023年4月16日正式發布 1.0Foupk3systemX5OS系統19.60&#xff08;X9&#xff09;2024年10月6日發布 Foupk3systemX5OS系統19.60增強版&#xff08;X9X5&#xff09;2024年10月6日發布Foupk3systemX5OS系統19.60正…

隨機生成的亂碼域名”常由**域名生成算法(DGA)** 產生

“隨機生成的亂碼域名”常由**域名生成算法&#xff08;DGA&#xff09;** 產生&#xff0c;是網絡攻擊&#xff08;尤其是僵尸網絡、惡意軟件控制場景 &#xff09;中躲避檢測的手段&#xff0c;以下是關鍵解析&#xff1a; ### 一、本質與產生邏輯 亂碼域名是攻擊者利用 **DG…

Solidity學習 - 繼承

文章目錄 前言繼承的基本概念繼承的基本用法單繼承實現函數重寫&#xff08;overriding&#xff09; 構造函數的繼承處理多重繼承抽象合約 前言 繼承是面向對象編程中的核心概念之一&#xff0c;Solidity作為一種面向對象的智能合約語言&#xff0c;同樣支持繼承機制。通過繼承…

依賴注入(Dependency Injection, DI)的核心概念和解決的核心問題

核心概念&#xff1a; 依賴注入是一種設計模式&#xff0c;也是實現控制反轉&#xff08;Inversion of Control, IoC&#xff09; 原則的一種具體技術。其核心思想是&#xff1a; 解耦&#xff1a; 將一個類&#xff08;客戶端&#xff09;所依賴的其他類或服務&#xff08;依…

Reactor Schedulers

Reactor 是一個基于響應式編程的庫&#xff0c;它提供了豐富的調度器&#xff08;Schedulers&#xff09;機制&#xff0c;用于管理異步操作的執行環境。Schedulers 是 Reactor 中的核心組件之一&#xff0c;它們允許開發者靈活地控制操作符和訂閱操作在哪個線程上執行&#xf…

設備樹引入

一、設備樹的基本知識 1、什么是設備樹&#xff1f;為什么會有設備樹&#xff1f; 2011年&#xff0c;Linux之父Linus Torvalds發現這個問題后&#xff0c;就通過郵件向ARM-Linux開發社區發了一封郵件&#xff0c;不禁的發出了一句“This whole ARM thing is a f*cking pain i…

【數據標注師】3D標注

目錄 一、 **3D標注知識體系框架**二、 **五階能力培養體系**? **階段1&#xff1a;空間認知筑基&#xff08;2-3周&#xff09;**? **階段2&#xff1a;核心標注技能深化**? **階段3&#xff1a;復雜場景解決方案**? **階段4&#xff1a;領域深度專精? **階段5&#xff1…

華為HN8145V光貓改華為藍色公版界面,三網通用,xgpon公版光貓

咸魚只賣20多元一個&#xff0c;還是xgpon的萬兆貓&#xff0c;性價比不錯哦 除了沒有2.5G網口&#xff0c;其他還行。 改成公版光貓后&#xff0c;運營商是無法納管光貓&#xff0c;無法后臺修改光貓數據及超密。 華為 HN8145V 光貓具有以下特點&#xff1a; 性能方面 高速接…

【LeetCode 熱題 100】438. 找到字符串中所有字母異位詞——(解法二)定長滑動窗口+數組

Problem: 438. 找到字符串中所有字母異位詞 題目&#xff1a;給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 【LeetCode 熱題 100】438. 找到字符串中所有字母異位詞——&#xff08;解法一&…

PAC 學習框架:機器學習的可靠性工程

PAC&#xff08;Probably Approximately Correct&#xff09; 是機器學習理論的核心框架&#xff0c;用于量化學習算法的可靠性。它回答了一個關鍵問題&#xff1a; “需要多少訓練樣本&#xff0c;才能以較高概率學到一個近似正確的模型&#xff1f;” 一、PAC 名稱拆解 術語…

嵌入式C語言數組:數組/字符數組

1. 數組 1.1 一維數組 數組是一串連續的地址&#xff1b; 數組名是地址常量&#xff0c;代表數組的起始地址&#xff1b; sizeof&#xff08;數組名&#xff09; 可得出數組的總內存空間&#xff1b; C 語言對數組不做越界檢查&#xff0c;使用時應注意&#xff1b; 數組不…

變長字節的數字表示法vb224

開始 數字有大有小&#xff0c;用多少字節表示呢&#xff1f; 本文描述的方案&#xff0c;采用變化的長度。vb是varying bytes的意思&#xff0c;224是表示它特征的一個數。 第一版&#xff1a; 每個字節8比特&#xff0c;最高的1比特用來表示“是否連續”&#xff0c;0表示…

ByteMD+CozeAPI+Coze平臺Agent+Next搭建AI輔助博客撰寫平臺(邏輯清楚,推薦!)

背景&#xff1a; 現在主流的博客平臺AI接入不夠完善&#xff0c;如CSDN接入的AI助手不支持多模態數據的交互、稀土掘金的編輯器AI功能似乎還沒能很好接入&#xff08;哈哈哈&#xff0c;似乎在考慮布局什么&#xff1f;&#xff09; 痛點分析&#xff1a; 用戶常常以截圖的形式…

【數據標注師】關鍵詞標注

目錄 一、 **理解關鍵詞標注的核心邏輯**1. **三大標注原則**2. **關鍵詞類型體系** 二、 **四階訓練體系**? **階段1&#xff1a;基礎規則內化**? **階段2&#xff1a;語義濃縮訓練**? **階段3&#xff1a;場景化標注策略**? **階段4&#xff1a;工具效率提升** 三、 **五…

for each循環語句

for each循環語句 for each.....nextFor Each 的案例 for each…next 1、循環對象合集 worksheets workbooks range range("區域")selection (選中的區域)usedrange或者currentregion 返回的單元格區域格式&#xff1a; for each 變量名 in 對象集合(范圍)循環內容…

基于LQR控制器的六自由度四旋翼無人機模型simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序 4.系統原理簡介 5.參考文獻 6.完整工程文件 1.課題概述 四旋翼無人機因其結構簡單、機動性強和成本低廉等特點&#xff0c;在航拍測繪、物流運輸、災害救援等領域得到廣泛應用。六自由度&#xff08;3維平移3維旋轉&#xff0…

vftp centos 離線部署

install_ftp_offline.sh vsftpd-3.0.2-28.el7.x86_64.rpm #!/bin/bash# 一鍵安裝配置vsftpd腳本&#xff08;開放根目錄&#xff0c;禁用chroot&#xff09;# 安裝vsftpd RPM包 echo "正在安裝vsftpd..." rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm if [ $? -ne 0 …

【數據標注】事件標注1

目錄 **一、 深入理解事件標注的核心概念****二、 系統學習&#xff1a;從理論到實踐****1. 吃透標注指南****2. 語言學基礎補充****3. 事件結構解析訓練** **三、 分階段實踐&#xff1a;從簡單到復雜****階段1&#xff1a;基礎標注訓練****階段2&#xff1a;進階挑戰****階段…