微信小程序 “万利商城”实战之六: 用户身份认证原理及详细编码实现(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数据的。

 

posted @ 2020-10-30 16:29  屏风马  阅读(373)  评论(0编辑  收藏  举报