当前位置: 首页 >服务端 > 微信小程序中用户登录和登录态维护

微信小程序中用户登录和登录态维护

提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情。像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件。

让用户登录,标识用户和获取用户信息,以用户为核心提供服务,是大部分小程序都会做的事情。我们今天就来了解下在小程序中,如何做用户登录,以及如何去维护这个登录后的会话(Session)状态。

在微信小程序中,我们大致会涉及到以下三类登录方式:

  • 自有的账号注册和登录
  • 使用其他第三方平台账号登录
  • 使用微信账号登录(即直接使用当前已登录的微信账号来作为小程序的用户进行登录)
第一和第二种方式是目前Web应用中最常见的两种方式,在微信小程序中同样可以使用,但是 需要值的注意的是,小程序中没有 Cookie的机制,所以在使用这2种方式前,请确认你们或第三方的API是否需要依赖 Cookie;还有小程序中也不支持HTML页面,那些需要使用页面重定向来进行登录的第三方API就需要改造,或不能用了。
 
我们今天主要来讨论一下第三种方式,即如何使用微信账号进行登录,因为这种方式和微信平台结合最紧密,用户体验比较好。
 

登录流程

引用小程序官方文档的登录流程图,整个登录流程基本如下图所示:

微信小程序中用户登录和登录态维护 _ JavaClub全栈架构师技术笔记

登录流程图

 

该图中,“小程序”指的就是我们使用小程序框架写的代码部分,“第三方服务器”一般就是我们自己的后台服务程序,“微信服务器”是微信官方的API服务器。

下面我们来逐步分解一下这个流程图。

步骤1:在客户端获取当前登录微信用户的登录凭证(code)

在小程序中登录的第一步,就是先获取登录凭证。我们可以使用wx.login()方法并得到一个登录凭证。

我们可以在小程序的App代码中发起登录凭证请求,也可以在其他任何Page页面代码中发起登录凭证请求,主要根据你小程序的实际需要。

 1 App({ 2onLaunch: function() { 3 wx.login({ 4success: function(res) { 5 var code = res.code; 6 if (code) { 7console.log('获取用户登录凭证:' + code); 8 } else { 9console.log('获取用户登录态失败:' + res.errMsg);10 }11   }12 });13   }14 })

步骤2:将登录凭证发往你的服务端,并在你的服务端使用该凭证向微信服务器换取该微信用户的唯一标识(openid)会话密钥(session_key)

首先,我们使用wx.request()方法,请求我们自己实现的一个后台API,并将登录凭证(code)携带过去,例如在我们前面代码的基础上增加:

 1 App({ 2onLaunch: function() { 3 wx.login({ 4success: function(res) { 5 var code = res.code; 6 if (code) { 7console.log('获取用户登录凭证:' + code); 8  9// --------- 发送凭证 ------------------10   wx.request({11 url: 'https://www.my-domain.com/wx/onlogin',12 data: { code: code }13   })14// ------------------------------------15 16 } else {17console.log('获取用户登录态失败:' + res.errMsg);18 }19   }20 });21   }22 })

你的后台服务(/wx/onlogin)接着需要使用这个传递过来的登录凭证,去调用微信接口换取openid和session_key,接口地址格式如下所示:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

这里是我使用了Node.js Express构建的后台服务的代码,仅供参考:

 1 router.get('/wx/onlogin', function (req, res, next) { 2let code = req.query.code 3  4   request.get({ 5 uri: 'https://api.weixin.qq.com/sns/jscode2session', 6 json: true, 7 qs: { 8grant_type: 'authorization_code', 9appid: '你小程序的APPID',10secret: '你小程序的SECRET',11   js_code: code12 }13}, (err, response, data) => {14 if (response.statusCode === 200) {15console.log("[openid]", data.openid)16console.log("[session_key]", data.session_key)17 18//TODO: 生成一个唯一字符串sessionid作为键,将openid和session_key作为值,存入redis,超时时间设置为2小时19//伪代码: redisStore.set(sessionid, openid + session_key, 7200)20 21   res.json({ sessionid: sessionid })22 } else {23console.log("[error]", err)24   res.json(err)25 }26   })27 })

这段后台代码成功执行的话,就可以得到openid和session_key。这个信息就是当前微信账户在微信服务器那边的登录态了。

但是,为了安全方面的原因,请不要直接使用这些信息作为你小程序的用户标识和session标识回传到小程序客户端中去,我们应该在服务器端做一层自己的session,将这个微信账号登录态生成一个session id并维护在我们自己的session机制中,然后把这个session id派发到小程序客户端作为session标识来使用。

关于如何在服务器端做这个session机制,我们现在一般采用键值对存储工具来做,比如redis。我们为每个session生成一个唯一的字符串作为键,然后可以将session_key和openid作为值,存入redis中,为了安全,存入的时候还应设置一个超时的时间。

步骤3:在客户端保存sessionid

开发Web应用的时候,在客户端(浏览器)中,我们通常将session id存放在cookie中,但是小程序没有cookie机制,所以不能采用cookie了,但是小程序有本地的storage,所以我们可以使用storage来保存sessionid,以供后续的后台API调用所使用。

在之后,调用那些需要登录后才有权限的访问的后台服务时,你可以将保存在storage中的sessionid取出并携带在请求中(可以放在header中携带,也可以放在querystring中,或是放在body中,根据你自己的需要来使用),传递到后台服务,后台代码中获取到该sessionid后,从redis中查找是否有该sessionid存在,存在的话,即确认该session是有效的,继续后续的代码执行,否则进行错误处理。

这是一个需要session验证的后台服务示例,我的sessionid是放在header中传递的,所以在这个示例中,是从请求的header中获取sessionid:

router.get('/wx/products/list', function (req, res, next) {  let sessionid = req.header("sessionid")  let sessionVal = redisStore.get(sessionid)  if (sessionVal) {// 执行其他业务代码  } else {// 执行错误处理  }})

好了,通过微信账号进行小程序登录和状态维护的简单流程就是这样,了解这些知识点之后,再基于此进行后续的开发就会变得更容易了。

另外,腾讯前端团队也开源了他们封装的相关库,可以借鉴和使用。


文章出处:一斤代码大神

作者:郭先生blog
来源链接:https://www.cnblogs.com/guoyeqiang/p/7850515.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/server/112281.html

分享给朋友:

“微信小程序中用户登录和登录态维护” 的相关文章

[C#] winform 子窗体向父窗体传值 2022年05月17日 20:26:20
Dart微基准测试第一部分 2022年05月23日 20:48:42
炒冷饭系列:设计模式 装饰模式 2022年05月26日 23:29:24
Go语言为并发而生 2022年05月30日 22:50:08
OpenHarmony的多内核 2022年05月30日 23:18:14
Python快速学习06:词典 2022年06月01日 23:19:38
项目ITP(一) 二维码 2022年06月02日 23:33:27