微信小程序 “万利商城”实战之六: 用户身份认证原理及详细编码实现(2)
上一篇文章讲了用户登录小程序后是如何通过wx.login()函数拿到code之后作为参数传递到Web服务器,
Web服务器又以code为参数调用微信接口拿到openid和session_key,并将openid和session_key保存到数据库,
最后Web服务器将用户信息Response到小程序端,小程序保存到本地存储,从而完成了用户登录。
所以在小程序中无需像Web应用程序那样需要用户提供用户名和密码来完成注册, 我们透过openid即可唯一标识小程序用户,
然后在Web服务器上用随机生成的GUID作为user_token建立自己的用户系统,同时将openid和user_token做一对一关联就可以了。
小程序在请求Web服务器数据时,只需要将user_token response到小程序端并保存到本地存储后,
后续的请求带上这个user_token就可以唯一标识用户了(其实openid也可以唯一标识用户,不过微信不建议传递openid到小程序端),
但这里有一个问题 :
一旦用户进入小程序后user_token就固定下来了, 用户会话永远不会过期,每次请求都带着这个user_token,
如果这个user_token被泄露出去,那么用户信息就会被盗用从而让Web服务器受到攻击。如何解决这个问题呢 ? 有如下三个方法。
方法一 :URL Param加密 。
在小程序端透过URL请求服务器数据之前, 先将要传递的参数用相关的加密算法(比如RSA)加密形成密文 ,
URL带着密文传递给Web服务器端, Web服务器端用相同的算法(如RSA)进行解密得到参数的明文后再使用。
如果解密失败 , 则返回给小程序端请求失败,需要重新登录。
方法二 :给user_token设定一个过期时间(以微信登录态时间为准) 。
过期时间一到,用户接下来的访问被终止, 提示用户重新登录,重新登录后可以重新设置user_token的值 ,
这样让代表用户身份的user_token值处于变化当中,降低被攻击的风险 。过期时间设置成多少合适呢 ?
可以和微信的登录态的时效性保持一致 ,先看看微信官方文档对登录态过期的说明 :
官方网址 : https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.checkSession.html
实现方式是这样的 :
小程序端在请求web服务器数据之前先调用wx.checkSession()检查session是否过期, 如果未过期,正常访问Web服务器,
如果过期,提示session已过期,用户点击重新登录按钮,小程序执行app.js中onLaunch()函数中的功能,重新调用wx.login()去生成user_token 。
方法三 :给user_token设定一个过期时间(以web服务器session过期时间为准) 。
这种方法需要web服务器在生成user_token后设置session[user_token]=“OK” , 小程序端带着user_token访问web服务器 ,
web服务器检查session[user_token]是否==“OK” , 如果为true , 正常执行, 否则返回session过期的信息给小程序端,
小程序端提示用户session已过期, 需要重新登录,用户点击重新登录按钮,小程序执行app.js中onLaunch()函数中的功能,
重新调用wx.login()去生成user_token 。
这里一定要注意web服务器设置session的时候是将user_token的值当成session的名称 ,然后进行赋值操作session[user_token]=“OK”,
这样做的好处是小程序端在发送请求时不需要去处理cookie ,利用Web服务器的资源/性能来处理session 。
如果在Web服务器端要使用session[“user_token”]=user_token这样的形式(注意session的名称就是字符串“user_token”)来获取/设置session,
那么小程序端在发送请求的时候一定要在header中设置cookie的值 , 否则是获取不到session数据的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人