手机版

小程序登录和数据解密的全面分析

时间:2021-12-10 来源:互联网 编辑:宝哥软件园 浏览:

不知不觉,我已经一个月没写了。堕落的日子如此平静是一种罪过。

好了,回到正文,我们来说说我们的小程序。

致敬

登录大部分逻辑代码来自手把手的指令教你小程序登录认证。

登录流程

小程序的登录和数据解密全解析(图1)

上图为官方登录流程。让我们来看看逻辑。

1.用户使用wx.login获取临时代码,该代码的有效期为5分钟。

2.把临时代码传到我们自己的后端服务,调用微信的API获取用户的session_key和openid。

3.后端定义新密钥,并将返回的session_key与openid相关联,并将新密钥返回给前端。

4.前端发送请求时带来密钥,后端解析后返回数据。

session_key和openid

1,session_key session key用于确定会话操作的有效性以及对用户数据进行加密和解密,可以由服务器自己存储,密钥不应该返回前端和会话。

2.openid用户唯一标识符也只用于服务器,可以用来识别用户的唯一性。

接下来说说他们的收购,是通过在服务器端调用微信API获得的。

空气污染指数:https://api.weixin.qq.com/sns/jscode2session

参数如下:

小程序的登录和数据解密全解析(图2)//applet page wx . log in({ success :(ret)={ request({ URL : ' 3358 test . com ',//后端服务器data 3360 { code 3360 ret . code } } } } }

//后端服务勒托选项={ URL : ' https://API.weixin.qq.com/SNS/jscode2session', QS : { appid 3360 appid,secret 3360 secret,js _ code3360 code,Grant _ type : ' authorization _ code ' } }//默认请求方法是getrequest (options,(err,response,body)={ if(err)return err return body/{ OpenID 3360 ' OpenID ',Session_key:'session_key'}看下面的代码})

生成新的密钥 skey

,我们得到了上面的session _ key和openid,下面两个字叫做keyID。接下来,我们生成一个新的密钥返回到前端,并将新的密钥与keyID相关联。

我们使用加密模块的sha1算法来生成密钥。

Const crypto=require ('crypto ')函数获取不稳定的(数据){return crypto。创建哈希(' sha1 ')。更新(数据,' utf8 ')。Digest ('hex')}当上面的代码返回时,我们会将其更改为这个新的s key,前端会将这个密钥存储在存储器中,并在请求时将这个skey带上。

wx.checkSession

用于检查当前用户的session_key是否有效。微信不会通知开发者session_key的有效期。用户使用小程序的频率越高,session_key的有效期就越长。

wx . check session({ success 3360 function(){//当前session_key有效.//可以写我们的业务代码}、}、fail : function(){///当前session_key已经过期wx.login() //再次登录,获取新的session_key}})当session_key过期时,我们调用登录API,更新session_key生成新skey,并关联它们之间的关系。

工具函数的封装

在我们面前,我们大致把流程串起来,然后把上面的流程写成常用函数。

//验证会话密钥状态函数c

heckSession(){return new Promise((resolve, reject) => {wx.checkSession({success:function(){resolve(true)},fail:function(){reject(false)}})})}// 登录function login(){return new Promise((resolve, reject) => {wx.login({success: (ret) => {wx.request({url:'本地服务地址',method: 'POST',data:{code: ret.code},success: (response) =>{wx.setStorageSync('skey', response.data.key) // 将skey存在storage里面resolve(response.data.key)}})}})})}// 请求function ajax(url, data, method="GET", config={}){let skey = wx.getStorageSync('skey') // 获取skeyif(!skey){ // 没有skey,首次登录return new Promise((resolve, reject) => {login()reject('请登录')})} else {return new Promise((resolve, reject) => { checkSession().then( _=> { if (_){ // session_key有效 wx.request({ url, method: method.toLocaleUpperCase(), data, header: Object.assign({}, { skey }, config), success: (ret) => { resolve(ret.data) } }) } else { // session_key失效 login() reject('session_key失效') } }) })}}

后端代码

后端使用koa框架,代码见文末github地址

解密

官方提供了多种编程语言的示例代码点击下载

这里我们使用微信运动API为例

var app = getApp()  // 我们将工具函数都放在了app的示例上面Page({onLoad:function(){app.Util.login().then(_ => {  // 先登录然后获取数据      this.getrunData()    })},getrunData(){    wx.getWeRunData({      success: (ret) => {        app.Util.ajax('本地服务地址', { iv: ret.iv, data: ret.encryptedData}, 'post').then(_=>{          console.log(_)        }, (err)=>{          console.log(err)        })      }    })  },})

返回结果如下

小程序的登录和数据解密全解析(图3)

以上,我们完成了小程序简单的登录鉴权和数据解密

小程序的登录和数据解密全解析(图4)

结尾

登录鉴权我们只是将用户状态放在了内存里,实际项目中肯定要放在数据库中,可以拜读下大神文章,里面说到了数据库的操作。

再次致敬

版权声明:小程序登录和数据解密的全面分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。