微信小程序登录的坑

前情概要

  1. 小程序端有 wx.login 获取code,然后后端通过 code 换取 session_key
  2. 小程序端有 wx.getUserInfo 获取用户信息

一开始处理登录的时候,前端通过 wx.login 获取到 code,然后通过 wx.getUserInfo 获取用户相关的信息,一起传递给后端,后端进行 sha1 验证,但是每次登录的时候,第一次验证不通过,导致登录不成功,需要第二次进行登录。

本身接口的设计就是通过 code 获取到 session_keyunionid 进行验证,如果数据库存在就直接进行当前用户登录,不存在通过 sha1 验证用户信息成功后,解密用户信息获取用户数据并进行自动注册后登录。

问题分析

小程序的文档,我仔细看了下,没发现有说明这两个接口调用的先后顺序,多次测试不成功之后才发现:

  1. 小程序调用 wx.login 的时候,并不会在微信小程序自己的服务器上生成 session_key
  2. session_key 有过期时间,具体过期时间小程序文档的说明是,使用小程序越频繁过期时间越久;
  3. code 有过期时间,过期时间5分钟;
  4. 每次调用 wx.login 获取到的 code 不一样,但是如果 session_key 没有过期,那么后端通过接口取到的 session_key 和上一次 code 取到的 session_key 一致;
  5. 小程序端通过 wx.getUserInfo 获取到的信息,相关的 signature 依赖于 wx.login 所产生的 session_key 进行加密;

以上是小程序的机制,从这里来看,按理来说,调用 wx.login 然后再调用 wx.getUserInfo 接口获取用户数据,传递到后端,再请求 session_key 然后验证用户数据进行自动注册应该来说是可行的,但实际上坑就再第一点。

也就是说,小程序端调用 wx.getUserInfo获取用户信息的时候,使用的是上一次服务端请求产生的session_key,当数据一起传送到后端的时候,通过code获取数据,但是此时上次的session_key已经过期了,会返回新的session_key,然后就会导致验证不通过。

所以整体上来说,后端应该先通过 wx.login 接口的 code 在后端获取到 session_key 以及 unionid,如果 unionid 检测当前用户不存在,缓存 session_keyunionid,再告知前端通过 wx.getUserInfo 接口向后端请求并进行注册绑定。


Kumfo 的杂货铺
做一些经验总结和一些学习心得分享,主要围绕PHP。 现在正在学习机器学习,会增加一些机器学习的思考分享。
avatar头饰
kumfo
SegmentFault 后端工程师

程序生存法则:

6.5k 声望
4.1k 粉丝
0 条评论
推荐阅读
Elasticsearch 按照标签匹配个数优先排序查询
首先最外层的数组就是我们通常写的query语句,放在body中进行请求的,主要看query里面的结构,这种需要自定义脚本处理评分的,query中只放了一个script_score:

kumfo2阅读 689

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木63阅读 6k评论 16

再也不学AJAX了!(二)使用AJAX ① XMLHttpRequest
「再也不学 AJAX 了」是一个以 AJAX 为主题的系列文章,希望读者通过阅读本系列文章,能够对 AJAX 技术有更加深入的认识和理解,从此能够再也不用专门学习 AJAX。本篇文章为该系列的第二篇,最近更新于 2023 年 1...

libinfs39阅读 6.2k评论 12

封面图
从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木41阅读 7.2k评论 6

CSS 绘制一只思否猫
欢迎关注我的公众号:前端侦探练习 CSS 有一个比较有趣的方式,就是发挥想象,绘制各式各样的图案,比如来绘制一只思否猫?思否猫,SegmentFault 思否的吉祥物,是一只独一无二、特立独行、热爱自由的(>^ω^&lt...

XboxYan42阅读 2.8k评论 14

封面图
还在用 JS 做节流吗?CSS 也可以防止按钮重复点击
举个例子:一个保存按钮,为了避免重复提交或者服务器考虑,往往需要对点击行为做一定的限制,比如只允许每300ms提交一次,这时候我想大部分同学都会到网上直接拷贝一段throttle函数,或者直接引用lodash工具库

XboxYan34阅读 2.3k评论 2

封面图
从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木32阅读 6.1k评论 9

avatar头饰
kumfo
SegmentFault 后端工程师

程序生存法则:

6.5k 声望
4.1k 粉丝
宣传栏