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