通過sails和阿里大于實現(xiàn)短信驗證
通過sails與阿里大于來實現(xiàn)注冊短信驗證碼的發(fā)送,邏輯圖如下
1、用戶在客戶端發(fā)送手機號給服務器,服務器接收到手機號,生成對應時間戳,隨機四位數(shù)驗證碼
2、服務器將電話號碼和驗證碼告訴阿里大于服務器,阿里大于服務器將驗證碼發(fā)送到對應手機
3、服務器將接受到的手機號,時間戳,驗證碼,與服務器秘鑰(為了增加秘鑰破解難度,提高安全)通過md5加密生成token,并且將token與時間戳發(fā)送到前端
4、前端接收到短信,輸入驗證碼后,再把驗證碼,手機號,接收到的token1和時間戳發(fā)送到服務器進行驗證
5、用接收到的時間戳與服務器時間進行對比,超過時間及返回超時,需要客戶端重新驗證
6、沒有超時遍開始核對,把第二次從客戶端接收到的驗證碼,手機號,時間戳與服務器秘鑰生成token2,如果token2與接收到的token1相同,則進行注冊,如果不同則返回驗證碼錯誤
Sails代碼:
service文件
需要npm install alidayujs --save
//services/SmsService.js var Alidayu = require('alidayujs'); module.exports = { sendSms: function(options, done) { //應用密匙 見:http://www.alidayu.com/help?spm=a3142.7802526.1.24.iEB4Yc&_t=1#create var config = { app_key: '你的key', secret: '你的secret' }; var alidayu = new Alidayu(config); //參數(shù) 見:http://open.taobao.com/doc2/apiDetail.htm?apiId=25450 var options = { sms_free_sign_name: '身份驗證', sms_param: { code: options.code, product: '開業(yè)啦', }, rec_num: options.phoneNumber, //多個手機號逗號隔開 sms_template_code: 'SMS_36835009', }; //發(fā)送短信 alidayu.sms(options, function(err, result) { if(err) { console.log('ERROR' + err); } return done() }); } }
sails service里的方法可以全局調用,第一個參數(shù)是各種參數(shù),第二個參數(shù)是回調函數(shù)。
sms_template_code是短信模板,需要登錄阿里大于自己注冊模板或者使用官方給的模板,每個模板號不一樣
Controller文件:
/** * SendController * * @description :: Server-side logic for managing Sends * @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers */ var crypto = require('crypto'); module.exports = { //發(fā)送短信 sendMsg: function(req, res) { var sercrt = "yhkevin"; var code = ''; var time = Date.now(); var phoneNumber = req.param('phoneNumber') var totle = '' var token = '' for(var i = 0; i < 4; i++) { code += Math.floor(Math.random() * 10); } totle = sercrt + code + time + phoneNumber; sails.log('驗證碼是:'+code) token = hash(totle); sails.log('token:' + token) SmsService.sendSms({ phoneNumber: phoneNumber, code: code }, function(err) { if(err) { return res.serverError(err); } return res.json({ token: token, time: time }); }) }, //驗證驗證碼并且注冊用戶 check:function(req,res){ var sercrt = "yhkevin"; var code = req.param('code'); var time = req.param('time') var phoneNumber = req.param('phoneNumber') var token1 = req.param('token') var totle = '' var token2 = '' totle = sercrt + code + time + phoneNumber ; token2 = hash(totle); console.log(token2) if(token1 == token2){ res.json({result:'注冊成功'}) }else{ res.json({err:'驗證碼錯誤'}) } } }; function hash(code) { var content = code; //加密的明文; var md5 = crypto.createHash('md5'); //定義加密方式:md5不可逆,此處的md5可以換成任意hash加密的方法名稱; md5.update(content); var d = md5.digest('hex'); //加密后的值d return d; }
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關文章
初學js 新節(jié)點的創(chuàng)建 刪除 的步驟
對于js 我是個初學者 甚至還不入門,我比較喜歡js做出的特效。2011-07-07JavaScript實現(xiàn)HTML5游戲斷線自動重連的方法
這篇文章主要介紹了JavaScript實現(xiàn)HTML5游戲斷線自動重連的方法,需要的朋友可以參考下2017-09-09IE6/7中getAttribute獲取href/src 屬性(相對路徑0值與其它瀏覽器不同
IE6/7中getAttribute獲取href/src 屬性(相對路徑0值與其它瀏覽器不同的解決方法2011-08-08JavaScript 函數(shù)節(jié)流詳解及方法總結
這篇文章主要介紹了JavaScript 函數(shù)節(jié)流詳解及實例的相關資料,需要的朋友可以參考下2017-02-02