主机参考:VPS测评参考推荐/专注分享VPS服务器优惠信息!若您是商家可以在本站进行投稿,查看详情!此外我们还提供软文收录、PayPal代付、广告赞助等服务,查看详情! |
我们发布的部分优惠活动文章可能存在时效性,购买时建议在本站搜索商家名称可查看相关文章充分了解该商家!若非中文页面可使用Edge浏览器同步翻译!PayPal代付/收录合作 |
让用户登录,识别用户并获取用户信息,以用户为核心提供服务,这是大部分小程序都会做的。今天我们来学习如何登录用户,以及登录后如何维护会话状态。【相关学习推荐:小程序开发教程】
在微信小程序中,我们大致会涉及到以下三类登录方式:
自己的帐户注册和登录;用其他第三方平台账号登录;使用微信账号登录(即直接使用当前登录的微信账号作为小程序的用户登录)。第一种和第二种方法是目前Web应用中最常见的两种方法,在微信小程序中也可以使用。但是需要注意的是,小程序中没有Cookie机制,所以在使用这两种方法之前,请确认你的API或者第三方的API是否需要依赖Cookie;也有不支持HTML页面的小程序。那些需要使用页面重定向登录的第三方API需要修改或者不能使用。
今天主要讨论第三种方法,即如何用微信账号登录,因为这种方法与微信平台结合最紧密,用户体验更好。
登录流程参考小程序官方文档的登录流程图。整个登录过程基本如下图所示:
在这个图中,“applet”是指我们使用applet框架编写的代码部分。“第三方服务器”一般是我们自己的后台服务程序,“微信服务器”是微信的官方API服务器。
让我们一步一步地分解这个流程图。
步骤1,在客户端获取当前登录的微信用户的登录证书(代码)
登录applet的第一步是首先获取登录凭证。我们可以使用wx.login()方法并获得一个登录证书。
我们可以在小程序的App代码中发起登录凭证请求,也可以在其他任何页面代码中发起,主要是根据你的小程序的实际需求。
第二步:将登录凭证发送到您的服务器,并在您的服务器上使用凭证与微信服务器交换微信用户的唯一ID (openid)和会话密钥(session_key)。
首先我们用wx.request()方法请求一个自己实现的后台API,把登录凭证(代码)携带过去,比如添加到我们之前的代码中:
然后你的后台服务需要使用传递的登录凭证来调用微信接口,以换取openid和session_key。
先介绍一下openid。微信官方账号使用的童鞋应该对这个logo比较熟悉。在公众平台中,用于识别每个用户在订阅号、服务号、小程序三种不同应用中的唯一标识。也就是说,每个应用中每个用户的openid是不一致的,所以在小程序中,我们可以用openid来标识用户的唯一性。
那么session_key是用来做什么的呢?有了用户ID,我们需要让用户登录,所以session_key保证了当前用户会话操作的有效性。这个session_key是微信服务器分发给我们的。也就是说我们可以用这个logo来间接维护我们小程序用户的登录状态,那么我们是怎么得到这个session_key的呢?我们需要在自己的服务器上请求微信提供的第三方接口https://api.weixin.qq.com/sns/jscode2session。
从这些参数中我们可以看到,要请求这个接口,我们必须首先调用wx.login()来获取用户当前会话的代码。那么,为什么我们需要在服务器端请求这个接口呢?其实为了安全起见,如果我们在前端通过request调用这个接口,必然需要将我们小程序的appid和applet的secret暴露给外界,同时也会将微信服务器下发的session_key暴露给“有心人”,给我们的业务安全带来很大的风险。除了在服务器端获取session_key,我们还需要注意两点:
Session_key对应微信分发的代码,同一个代码只能兑换一次session_key。每次调用wx.login()时,都会发出一个新的代码和对应的session_key。为了保证用户体验和登录状态的有效性,开发者需要知道用户在调用wx.login()之前需要重新登录。
Session_key无效,即使不调用wx.login,session_key也会过期。到期时间与用户使用小程序的频率正相关,但具体时间开发者和用户都无从得知。
步骤3:生成3rd_session
如前所述,登录状态由session_key“间接”维护。所谓间接,就是我们需要自己维护用户的登录状态信息。这里也考虑了安全因素。如果直接用微信服务器分发的session_key作为业务端的登录状态,就会被有心人用来获取用户的敏感信息,比如接口wx.getUserInfo(),需要session_key配合微信的解密。
那么如果我们生成自己的登录状态标识呢?在这里,我们可以使用几种常见的不可逆哈希算法,如md5、sha1等。,来标识生成的登录状态(这里我们统称为 # 39;斯基 # 39;)返回到前端,登录状态标识在前端维护(通常存储在存储中)。在服务器端,我们会将生成的skey存储在用户对应的数据表中,前端通过传递skey来访问用户的信息。
步骤4:在客户机中保存会话ID
开发Web应用时,在客户端(浏览器)中,我们通常会将会话ID存储在cookie中,但是小程序没有cookie机制,所以不能使用cookie。但是,小程序有本地存储,所以我们可以使用存储来保存会话ID,供后续的后台API调用使用。
之后在调用需要登录后才有权限访问的后台服务时,可以把存储在存储中的Session ID拿出来,在请求中携带(可以在头中携带,也可以在querystring中携带,也可以在正文中携带,根据自己的需要使用),传递给后台服务。在后台代码中获取会话ID后,查找redis中是否存在该会话ID。如果存在,确认会话有效,继续后续代码执行,否则进行错误处理。
在前面,我们将skey存储在前端存储中,我们每次发出用户数据请求时都会带上skey。如果这个时候session_key过期了怎么办?所以我们需要调用API wx.checkSession()来检查当前session_key是否已经过期。这个API不需要传入任何关于session_key的信息参数,而是微信小程序自己调整自己的服务来查询用户最近生成的session_key是否过期。如果当前的session_key过期,让用户再次登录,更新session_key,并在用户数据表中存储最新的skey。
第五步:支持emoji表情存储
如果需要在数据表中存储用户的微信名,那么确认数据表和数据列的编码格式。因为用户的微信名可能包含emoji图标,而常用的UTF8代码只支持1-3字节,emoji图标正好是4字节用于存储。
这里有两种方式(以mysql为例):
1.设置存储字符集。
MySQL 5 . 5 . 3版以后,数据库、数据表、数据列的字符集可以设置为utf8mb4,所以可以在/etc/my.cnf中设置默认的字符集编码和服务器端编码格式。
有关编程的更多信息,请访问:编程入门!!小程序就是这样登录用户的。如何维护登录状态?更多详情请关注主机参考其他相关文章!
这几篇文章你可能也喜欢:
- 小程序如何做用户登录?如何维护登录状态?
- 如何在wordpress插件中添加用户登录功能(WordPress插件在哪个文件夹中)
- Win11如何查看用户登录记录;Win11启动时如何显示账户登录信息(win10启动时如何查看当前登录账户)
本文由主机参考刊发,转载请注明:小程序如何做用户登录?如何维护登录状态?(小程序登录注册保持登录状态) https://zhujicankao.com/78166.html
评论前必须登录!
注册