
本文实例讲述了微信小程序登录数据解密及状态维持。分享给大家供大家参考,具体如下:
学习过小程序的朋友应该知道,在小程序中是不支持甜饼干的,借助小程序中的缓存我们也可以存储一些信息,但是对于一些比较重要的信息,我们需要通过登录状态维持来保存,同时,为了安全起见,用户的敏感信息,也是需要加密在网络上传输的。
前台服务。封装了超文本传送协议(超文本传输协议的缩写)请求,同时封装了getSession(通过密码获取服务器生成的会话)、getUserInfo(获取用户信息)、getDecryptionData(解密数据)
//service.js//封装了超文本传送协议(超文本传输协议的缩写)服务,getUserInfo,提供回调函数var资源={ domain : ' http://www。领域。com/' }模块。导出={//Http Get request get:函数(URL,数据,CB){ wx。请求({ URL :资源。域URL,data:数据,method: 'GET ',header: {},success :函数(RES){ CB(RES,true) },fail:函数(){ cb(data,false)获取第三方会话Id getSession:函数(代码,CB){ wx。请求({ URL :资源。域'小例程/邮政编码',data: { code: code },method: 'POST ',success : function(RES){ CB(RES,true) },fail: function (res) { cb(res,false)} },//获取用户信息getUserInfo:函数(CB){ wx。获取用户信息({成功:函数(res) { cb(res,true) },fail:函数(res) { cb(res,false)})},/获取解密数据getDecryptionData:函数(CB){ wx。请求({ URL :资源。域'小例程/解密'),数据: { encryptedData : wx。getstorage ync(' encryptedData '),iv : wx . getstorage ync(' iv '),session : wx。getstorageync(' thirdesionid '),},method: 'POST ',success:函数(res)后台,根据密码获取会话,客户端用来保持登录状态
[https]公共行动结果邮政编码(字符串代码){尝试{ if(!字符串IsNullOrEmpty(代码)){ Httpwebrequest=(Httpwebrequest)Httpwebrequest .创建(字符串. format(' https://API。微信。QQ。com/SNS/jscode 2会话?appid={ 0 } secret={ 1 } js _ code={ 2 } grant _ type=authorization _ code ',appId,appSecret,code));请求。方法=' GETHttpWebResponse=(HttpWebResponse)请求GetResponse();StreamReader sr=新的StreamReader(响应. GetResponsesStream());字符串内容=Sr . ReadToEnd();如果(响应StatusCode==HttpStatusCode .好的){ var successModel=Newtonsoft .Json。JsonConvert。反序列化ObjectValidateCodeSuccess(内容);if(null!=SuccessMoDEL。session _ key){//session _ key是微信服务器生成的针对用户数据加密签名的密钥,不应该传输到客户端var session _ key=SuccessMoDEL。session _ key//3re_session用于服务器和小程序之间做登录状态校验var thirdSession=Guid .NewGuid().ToString().替换('-',' ');var now=DateTime .现在;//存到数据库或者存储缓存,这里一小时过期服务。添加登录(新域Login() { Code=code,Createime=now,OpenId=successModel.openid,OverdueTime=now .AddMinutes(60),会话密钥=successmodel。session _ key,session rd=third dession });返回Json(new { success=true,session=thirdSession,openId=successmodel。openId });} else { var errModel=Newtonsoft .Json。JsonConvert。反序列化ObjectValidateCodeFail(内容);返回Json(new { success=false,msg=errmodel。errcode ' : ' errmodel。errmsg });} } else { var errModel=Newtonsoft .Json。JsonConvert。反序列化ObjectValidateCodeFail(内容);返回Json(new { success=false,msg=errmodel。errcode ' : ' errmodel。errmsg });} } else { return Json(new { success=false,msg='code不能为null ' });} } catch(Exception e){ return Json(new { success=false });}}解密敏感信息
[httpset]公共操作结果解密(字符串加密数据,字符串iv,字符串会话){ try { var session key=Service .GetSessionKey(会话);if(!字符串IsNullOrEmpty(sessionKey)){ var str=AES decrypt(encryptedData,session key,iv);定义变量数据=牛顿英尺Json。JsonConvert。反序列化对象加密数据(字符串);if(null!=数据){ //服务器可以更新用户信息返回Json(new { success=true,data=data });} } }捕获(异常e){ 0服务“AddLog(”翻译错误:' e . ToString());}返回JSON(new { success=false });}AES解密
公共静态字符串AESDecrypt(字符串加密数据,字符串密钥,字符串iv){ if(字符串.IsNullOrEmpty(encryptedData))返回"";字节[]加密数据2=转换.来自base64字符串(加密数据);系统。安全性。密码学RijndaelManaged rm=新系统。安全性。密码学RijndaelManaged { Key=Convert .FromBase64String(键),四=转换.FromBase64String(iv),模式=系统。安全性。密码学。密码模式CBC,填充=系统。安全性。密码学。填充模式。pkcs7 };系统。安全性createDecryptor();字节[]结果数组=ctf .transformfinallyblock(encrypteddata 2,0,加密数据2 .长度);返回编码. UTF8。GetString(结果数组);}判断用户是否掉线
[HttpSet]公共操作结果PostSession(字符串会话){ if(!字符串IsNullOrEmpty(会话)){ var loginInfo=Service .GetLoginInfo(会话);if(null!=loginInfo){ return Json(new { success=true,openId=loginInfo .OpenId });} else { return Json(new { success=false });} }返回JSON(new { success=false });}前台index.js
//索引。jsvar app=GetApp()Page({ data : { UserInfo : },},OnLoad : function(){ var那=这个app。GetUserInfo(函数(UserInfo){//更新数据那个。setdata({ UserInfo : UserInfo })})})前台app.js
var服务=需要' ./服务/服务。js’)var appConfig={ getuser ninfo : function(CB){ var that=this if(that。全球数据。userninfo){//从缓存中用户信息} else { //wx api登录wx。登录({ success : function(RES){ console。日志('登录成功密码为:' RES . code);if(RES . code){ service。GetSession(RES . code,function (res,success){ if(success){ console。日志('通过密码获取第三方服务器会议成功,会话为:' RES . data。会议);//缓存起来wx。setstorageync(' thirdesionid ',RES . data。会议);//wx api获取用户信息service.getUserInfo(函数(res,success){ if(success){ console。日志('获取用户信息成功,加密数据为:' RES . encrypted data);console.log('获取用户信息成功,加密向量为* ` RES . iv);//缓存敏感的用户信息,解密向量wx。setstoragesync(' encryptedData ',RES . encryptedData);wx。setstorageync(' iv ',RES . iv);那个。全球数据。userinfo=RES . userinfo//解密数据service.getDecryptionData(函数(res,success){ if(success){ console。日志('解密数据成功');控制台。日志数据。数据);} else { console.log('解密数据失败');} }) } else { console.log('获取用户信息失败') } });} else { console.log('通过密码获取第三方服务器会议失败');} });} else { console.log('登录失败:');} } }) }),全局数据: { user info : null } } App(appConfig)运行输出
希望本文所述对大家微信小程序开发有所帮助。