小程序开发总结(session部分)

最近刚完成了一项小程序的开发任务。彻彻底底地从零开始,其中遇到了不少坑要填,因此来总结一下,希望能帮助到其他人,避免重复踩坑。

登录态维护

每个人开发小程序,都希望用户能持续使用自己开发的小程序,那么维护用户的登录态就是首要的任务。

无cookie

首先,第一个需要踩的坑就是无cookie的登录态要如何维护。

微信官方提供了一个流程图,我们可以先看看:

微信官方登录时序图
微信官方登录时序图

简而言之:

  1. 在小程序上通过wx.login()获取code
  2. code传到自己的服务器,然后将小程序的secretappid与微信服务器交换openidsession_key
  3. session_key加上随机数生成sessionId,然后openidsession_key存在session
  4. 小程序将sessionId存起来,每次访问都带上这个sessionId

小程序获取code

在小程序的app.js文件里,onLaunch函数调用我们写好的login函数:

wx.login({
  success: function (loginResult) {
    wx.getUserInfo({
      withCredentials: true,
      success: function (userResult) {
        // doLogin 就是将这些数据发送到服务器
        doLogin(null, {
            code: loginResult.code,
            encryptedData: userResult.encryptedData,
            iv: userResult.iv
        })
      }
    })
  }
})

服务器接受到这些数据,就可以和微信服务器交换数据了,这时我们拥有的数据就是openidsession_key

解密用户信息

通过小程序传过来的和encryptedDataiv,然后还有刚才获取的session_key,我们就能解密用户的信息,通过对比解密出来的openid和微信交换来的openid对比,即可知道用户信息的正确性。

sessionId生成:

function generateSessionId() {
  return crypto.randomBytes(32).toString('hex')
}

按理说,我们生成了sessionId,然后将对应的用户信息存在session里就大功告成了。

但是这样的话,很容易被伪造的暴力的伪造sessionId攻击。因此,需要再进一步,生成另外一个校验数据称为sessionkey简称sKey,这时就使用到刚获取到的session_key

function generateSkey(sessionKey) {
  const sha1 = (message) => {
      return crypto.createHash('sha1').update(message, 'utf8').digest('hex')
  }

  return sha1(appid + secret + sessionKey)
}

此时我们的sessionkey就是一个前面随机生成的sessionIdvalue则为:

{
  userinfo,
  session_key,
  sKey
}

然后每次sessionId传递过来的时候,我们获取对应的session_key,然后调用generateSkey生成sKey,然后和session里面的sKey对比即可。

此时,session的生成大功告成了!

两个登录态的问题

首先,调用微信生成的code的login()函数是有时效的,大概5分钟。

我们生成的session也是有时效的。这样就有两个登录态任一出现失效的情况。因此我们需要处理两个的失效问题。

小程序登录态

官方提供了wx.checkSession()方法给我们验证登录态是否失效。因此这个失效的话,我们就重新调用之前写好的login函数

session失效

这个失效的问题就比较麻烦。很有可能就是发送某一个请求的时候发现session失效了。

因此我们可以在app.jsonShow()里发送请求到服务器测试session是否过期。过期的话就重新调用login函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容