微信小程序> 小程序的登录鉴权&&数据解密

小程序的登录鉴权&&数据解密

浏览量:798 时间: 来源:Leon_94

小程序的登录鉴权&&数据解密

登录流程

1、用户使用wx.login获取临时code,有效期为5分钟

2、将临时code传到我们自己的后端服务,调用微信的API获取用户的session_keyopenid

3、后端自定义新的密钥并关联返回的session_keyopenid,将新的密钥返给前端

4、前端发送请求的时候,带着密钥,后端进行解析后返回数据

session_key和openid

1、session_key会话密钥,用来确定会话的操作的有效性和用来加密解密用户数据,服务器自己存储即可,不应该将密钥返给前端和对话使用

2、openid用户唯一标识,同样只用于服务器,可以用来标识用户的唯一性

接下来,我们说下它们的获取,通过服务端调用微信API获取

API:https://api.weixin.qq.com/sns/jscode2session

参数如下:

小程序

// 小程序页面wx.login({success:(ret)={wx.request({url: 'http://test.com', // 后端服务器data:{code : ret.code}})}})

后端服务我们使用request模块来发送请求

// 后端服务let options = {  url: 'https://api.weixin.qq.com/sns/jscode2session',  qs:{      appid: appid,        secret: secret,      js_code: code,      grant_type:'authorization_code'  }}// 默认请求方式是getrequest(options, (err, response, body) = {if(err) return errreturn body  // {openid:'openid', session_key:'session_key'} 不是真正的返回 看下面的代码})

生成新的密钥 skey

上面我们获取了session_key和openid,下文两个字断称keyID,接下来我们生成一个新的密钥返回前端并将新密钥关联keyID。

我们使用crypto模块的sha1算法生成密钥

const crypto = require('crypto')function getShaKey(data){return crypto.createHash('sha1').update(data, 'utf8').digest('hex')}

上面的代码返回我们就改成这个新的skey,前端将这个密钥存在storage里面,请求的时候带上这个skey,就完成了自定义登录态。

wx.checkSession

用来校验当前用户的session_key是否有效,微信不会把session_key的有效期告知开发者,用户越频繁使用小程序,session_key有效期越长。

wx.checkSession({success:function(){  // 当前session_key有效... // 可以写我们的业务代码},fail:function(){   // 当前session_key已过期wx.login()  // 重新登录,获取新的session_key}})

当session_key过期的时候,我们调用登录API,更新session_key生成新的skey,并关联二者关系。

工具函数的封装

前面我们将流程大概串了下,接下来我们把上面的流程写成代码

// 验证session_key状态function checkSession(){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框架

解密

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

这里我们使用微信运动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)        })      }    })  },})

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎