美文网首页微信小程序微信小程序小程序
微信小程序中用户登录和登录态维护

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

作者: 一斤代码 | 来源:发表于2017-02-08 16:38 被阅读60243次

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

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

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

  • 自有的账号注册和登录
  • 使用其他第三方平台账号登录
  • 使用微信账号登录(即直接使用当前已登录的微信账号来作为小程序的用户进行登录)

第一和第二种方式是目前Web应用中最常见的两种方式,在微信小程序中同样可以使用,但是需要值的注意的是,小程序中没有Cookie的机制,所以在使用这2种方式前,请确认你们或第三方的API是否需要依赖Cookie;还有小程序中也不支持HTML页面,那些需要使用页面重定向来进行登录的第三方API就需要改造,或不能用了。

我们今天主要来讨论一下第三种方式,即如何使用微信账号进行登录,因为这种方式和微信平台结合最紧密,用户体验比较好。

登录流程

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

登录流程图

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

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

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

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

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

App({
  onLaunch: function() {
    wx.login({
      success: function(res) {
        var code = res.code;
        if (code) {
          console.log('获取用户登录凭证:' + code);
        } else {
          console.log('获取用户登录态失败:' + res.errMsg);
        }
      }
    });
  }
})

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

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

App({
  onLaunch: function() {
    wx.login({
      success: function(res) {
        var code = res.code;
        if (code) {
          console.log('获取用户登录凭证:' + code);

          // --------- 发送凭证 ------------------
          wx.request({
            url: 'https://www.my-domain.com/wx/onlogin',
            data: { code: code }
          })
          // ------------------------------------

        } else {
          console.log('获取用户登录态失败:' + res.errMsg);
        }
      }
    });
  }
})

你的后台服务(/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构建的后台服务的代码,仅供参考:

router.get('/wx/onlogin', function (req, res, next) {
  let code = req.query.code

  request.get({
    uri: 'https://api.weixin.qq.com/sns/jscode2session',
    json: true,
    qs: {
      grant_type: 'authorization_code',
      appid: '你小程序的APPID',
      secret: '你小程序的SECRET',
      js_code: code
    }
  }, (err, response, data) => {
    if (response.statusCode === 200) {
      console.log("[openid]", data.openid)
      console.log("[session_key]", data.session_key)

      //TODO: 生成一个唯一字符串sessionid作为键,将openid和session_key作为值,存入redis,超时时间设置为2小时
      //伪代码: redisStore.set(sessionid, openid + session_key, 7200)

      res.json({ sessionid: sessionid })
    } else {
      console.log("[error]", err)
      res.json(err)
    }
  })
})

这段后台代码成功执行的话,就可以得到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 {
    // 执行错误处理
  }
})

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

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

感谢阅读我的文章,如有疑问或写错的地方请不吝留言赐教。

一斤代码的《微信小程序》相关教程文章
一斤代码的《从编程小白到全栈开发》系列教程文章

相关文章

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

    提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情。像微信这样的一个社交平台,如果做...

  • 浅谈微信小程序登陆与Oauth

    参考: 从密码到token, 一个授权的故事 理解OAuth 2.0 小程序官方文档 微信小程序之登录态维护(十一...

  • 微信小程序的登录允许拒绝

    多次拒绝登录和允许登录 微信小程序的登录获取用户信息,是通过微信弹出窗口,用户可点击允许 和拒绝两个按钮,点击允许...

  • 微信小程序登录

    小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。小程...

  • 20161125微信小程序学习笔记-NO.1登录初始化

    登录初始化 微信小程序是建立在微信基础上的,所以小程序在调用用户登录最直接的办法就是调用微信登录,所以要用到微信登...

  • 小程序维护登录态

    一:何为登录态? 所谓登录态,就是程序在运行时,能够识别当前用户,能够证明自己的唯一性且合法。我们知道,WEB服务...

  • 【微信小程序】企业微信中的获取用户信息

    企业微信小程序登录获取用户信息和微信小程序获取用户信息步骤不太一样,其中微信小程序获取用户信息需要做低版本兼容,具...

  • java实现微信小程序登录态维护

        相信不少喜欢开发的朋友都已经知道微信小程序是个什么物种了,楼主也是从小程序内测期间就开始关注,并且也写过几...

  • 小程序微信登录

    旧方案 1.手机号+验证码登录 2.微信授权登录 1.用户点击微信授权,小程序端获取手机号。2.小程序端将手机号和...

  • 如何优雅的处理微信小程序授权登录

    前言 当微信小程序项目中涉及到获取用户信息并实现用户登录时,可以通过微信官方提供的登录能力方便地获取微信的用户身份...

网友评论

  • ea0a8bedc35a:博主大人,我想问问,我获取到从后端取来的3rd_session,如果写入storage,以什么为key,然后如果要怎么获取session
    一斤代码:@Bug夜 是的,是用户自己手机上的缓存
    ea0a8bedc35a:@一斤代码 这个storage是不是只是小程序自己的缓存,获取的时候不会获取到别人的缓存?
    一斤代码:写到小程序端的storage么?随便取个名字就可以了,比如skey。然后前端要获取这个值的话,就用wx.getStorage方法来取。
  • f0d03c55c7ad:请问,用户如何退出小程序并跳转到首页呢

    现在可以跳首页,但不能清除用户信息
    一斤代码:你用户信息是存哪里的呢?存哪里就把那的数据清空就行了
  • 工程设计:看完评论又涨知识了。
  • 11abe284b27c:用一句李云龙的话评论你,"你真他娘的是个天才”"
  • 温室里的香菇:你好,请问,用户使用app时选了微信账号A登录,然后绑定了我们自己平台的账号(强制绑定),现在用户用微信账号B打开小程序,还能用那个已被微信账号A绑定的平台账号登录吗?如果不能,是不是可以把平台账号与A解绑,然后再与B绑定?
    一斤代码:你用微信账号B打开小程序,然后用你们平台账号密码登录应该还是可以的吧。登录进去后再做个解绑和重新绑定的功能,应该就可以了。
  • e5530ecb97fe:博主你好,想请教下,我这有一个改版后登入的思路望指正:用户如果第一次进入小程序,我就在入口文件onLoad 请求wx.login并把code传后台,后台就返回openid(保存本地)和 sessionId(你说的登入态 也是保存本地);如果需要获取用户头像昵称等 就请求userInfo(按钮触发),把encryptedData、iv、sessionId(为了去后台找相应的session_key)传后台,后台根据这些参数 获取用户私密信息 返回客户端~至此完成
    d6f1ce838b5b:是前端不能直接userinfo获取openid的意思吗?
    e5530ecb97fe:@一斤代码 其实我这里有个疑问,比如其实直接可以userInfo(按钮触发)的步骤直接拿到用户信息(昵称头像等),为何要传encryptedData、iv去让后台拿再传给我客户端,感觉多此一举呢?数据安全嘛,还是微信闲的蛋疼:sweat_smile:
    一斤代码:可以的。
  • d7387c12438b:博主,我想问下如果sessionId过期后,要怎样处理呢
    一斤代码:重新走登录流程生成新的sessionId
  • 渡口遛恋:博士大佬,作为一个大三学生看了好多博客,就是没整明白这个登录太的问题,终于理解这个逻辑了,感激不尽。可我是个node小白,能不能给我完整后台demo让我学习学习呢。
    渡口遛恋:@一斤代码 好的好的
    一斤代码:最近会把微信小程序近期API调整后的新登录流程的前后端代码整理并分享出来,关注我的简书吧
  • cc977f5a8a04:写的真好,很详细,对我这样的新手很有用,给博主一个大赞:+1:
  • a615bf425e4f:博主写的很详细 很适合新手get 点赞
  • 前端黑板报:博主写的很好,感谢!
  • 柏木_:博主大佬,我们现在用的就是自有账号的注册和登录,请问这种在小程序中该怎么获取用户的登录信息和登录状态?跪求。。。。。
    一斤代码:自有账号注册登录这个最简单了呀,和网页的做法最接近了。唯一不同的是小程序中不能用cookie,因此可能你们原先需要使用cookie携带的数据(比如session id或token)不能存在cookie中,而需要转用小程序的storage,然后发送的请求中将这些数据通过比如header来进行传输而已,其他的流程完全和网页做法一致。
  • 宇浩弟弟:楼主你好,如果我的小程序是需要规定特定的人群才能使用我小程序的功能,那对于这个wx.login这种方式的登陆,是否就没有意义了?就比如我事先在我后台服务器里里面维护好所有使用人的手机号码或者某个标识,在小程序登陆请求的时候,我直接调自己的接口验证下,这个标识是否存在,可以的话,直接就展开后续业务.
    一斤代码:@工程设计 不是刻意回避这个问题,而是这本是两个不同的问题。一个是API的广义授权,一个是根据具体的业务进行权限设计和权限验证。
    工程设计:是啊,为何感觉大家都回避这个用户验证的过程呢?还是我没看懂?是不是随便谁用小程序都能访问你的服务端东西了?这个验证的意义何在呢?
  • 我不是掌柜:打扰了,咨询一下,程序未上线怎么调试二维码功能的呢?
    我不是掌柜:@一斤代码
    恩这个又看,但是这个二维码需要怎么生成呢?我用指定的page
    一斤代码:利用微信开发者工具中提供的“条件编译”和“预览“生成的二维码,其实官方文档中有说明的。https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html
  • 我不是掌柜:checkSession和login,你那边是直接在首页处理的么?还是在app.js里面?如果是app.js,会不会影响加载速度呢
    我不是掌柜:另外,app.js里面的网络请求结束之后才执行加载首页index么?有没有执行顺序差异
    我不是掌柜:@一斤代码 好的,再咨询个问题,我们在app.js里面发送网络请求获取到了uid,然后这个uid会在小程序首页index.js中使用,根据uid来加载数据。现在有个问题是首页index已经加载出来了,uid还没有从网络请求中返回,导致首页请求接口失败,有什么好的方法处理么?
    一斤代码:@kakarotto 不是,是在往服务端发送请求时才做检查。具体做法可以参考腾讯的wafer client sdk
  • 凯贝尔:自动登录和会员系统的自有账户注册登录是最常用2个方式
  • 我不是掌柜:请问服务器判断sessionid不存在后,是如何处理的呢
    我不是掌柜:@一斤代码 好的,另外,咨询个问题:如果在小程序中每个用户都有一个小程序二维码,那这个二维码是服务端生成呢?还是小程序端生成呢
    我不是掌柜:@一斤代码 恩恩,谢谢。
    一斤代码:服务器判断sessionid不存在,则返回一个错误信息到前端,前端接收到这个错误信息,重新向服务端发起一个申请session的流程
  • ToBeAbetter:写的简洁明了,了解了微信小程序登录后前后端怎么交互的,本来还想着直接写个界面让用户去登录的,也就是楼主说的第一种方式,但是看了很多小程序,基本上都是直接使用微信登录的,看官方文档也是云里雾里,看了楼主写的文章之后,了解了很多,感谢楼主
  • 46f6432b338a:如果api的token会过期的话,怎么去重新登录呢
    一斤代码:在小程序中每次调用后台业务API的时候,先使用wx.checkSession()来检查会话是否过期,如果已过期,则重新调用建立会话的代码流程,然后再调用目标业务API;如果未过期,则直接调用业务API。

    你可以参考下文章最后提到的Wafer这个框架的代码。
  • 茶泡饭inJuly:请教一下作者。小程序可以不使用wx.login(object)接口吗?如果是一个纯工具的小程序,开发者也不想知道谁用过。是否可以不使用wx.login接口?那么微信记录用户用过的历史小程序的原理是什么?
    茶泡饭inJuly:@一斤代码 请问小程序若是调用了wx.login,需要得到用户的同意么?会有一个显式的要求登录的用户界面么?还是在请求授权的过程中,用户同意授权,即可调用wx.login?
    一斤代码:微信中的小程序历史列表跟这个登录没什么关系
    一斤代码:你这种情况可以不用wx.login。
  • 249c05597c12:你好,我现在有个问题不知道方不方便解答,我们有个app,可以使用自己微信登录,然后绑定账号;现在我做了个小程序,但是我使用了小程序里的微信绑定登录后,再使用APP的微信绑定登录就失效了,需要重新绑定,小程序也已经给app微信登录的公众号绑定了,请问这是哪方面的原因呢,方便的话能不能加qq:476508065或微信:lenovoing解答一下,谢谢
    249c05597c12:@一斤代码 是openid,我看微信文档里,不是说openid在同一个公众号下都是一样的么,我今天让后台查一下
    一斤代码:如果使用的是openid,最好查看一下是不是两种方式登录获取到的openid不一致导致的。
    一斤代码:你们的微信第三方登录和小程序登录过程中,后台获取和使用的是openid还是unionid来做为微信用户的标识的?
  • 这个呢称被占用了吗:您好,我想问一个问题,我现在做的小程序登录时需要输入手机号来验证身份,所以是不是不需要按照第三种官方推荐的方式来维持登录态呢。
    一斤代码:@这个呢称被占用了吗 理论上是可以的。不过一般不会放在缓存中,一般会把这种用户信息放进数据库。
    这个呢称被占用了吗:您好,还需要问您一个问题,就是如果用的是手机号来验证身份,那么现在相当于把手机号当成了用户的唯一标识,如果用用户登录成功,就把手机号放入缓存中,下次登陆的时候,如果从缓存中获取到手机号,则进入主页,如果没有获取到,则进行登录操作,这样可以吗?感觉这样和微信服务器没有任何的交互了,是吗?谢谢您
    一斤代码:是的,不需要按照这个流程来做。
  • 6554029df71a:感谢博主回答,很清晰,逻辑基本都明白了。我想问的是 关于页面的 就是假如我有四个页面 其中一个页面是专门登录第三方APP的账号和密码的 登录框页面,其他页面都是需要登录后 才能获取信息的页面 那么我写代码的 时候 是不是应该在每个页面的onload里面获取登录态 假如未登录 就去重定向到 登录页面呢? 还是说在app的 onLaunch里 获取登录态 若登录就默认跳去小程序的主页面 未登录就跳去登录页面呢?一般怎么处理这种 比较友好?
    一斤代码:@EblisyAn_ 根据当前页面是否有用户信息来决定是否显示当前wxml的信息🙂
    6554029df71a:@一斤代码 感谢回答 如果调用之后是没登录的 将会在当前页面跳转去登录页 这样的交互会不会不太好? 因为等于用户进入该页面 看到页面某瞬间后 然后才会跳走。
    一斤代码:onLaunch是一次性的,处理起来不是很全面。一般可以写一个公共的登录检查service,然后在每个需要检查登录的Page里面去调用。
  • 48f676afd96b:请教一下,您说的第三种方式“使用微信账号登录”,这种登录方式的前提也是首先绑定微信账户和系统账户吧
    48f676afd96b:@一斤代码 再请教下,我这样理解对不对。首先要在系统的数据库保存一张微信用户与系统用户关联映射表。另外在系统的redis中存储系统的sessionid 和微信的session key及openid键值对。在小程序的storage中保存系统的sessionid。你画的登录时序图,是针对已绑定微信和系统用户,但未登录系统(没有sessionid)下的情况。
    一斤代码:@acpb 嗯,是的
    48f676afd96b:(补充上面)换句话说,使用“微信账号登录”这种方式的前提,第一次应该是首先登录本系统,然后将系统账户跟微信账户做个关联
  • 逆_旅:大部分代码跟你的一样,我现在想要把token传给小程序前端,并且保存,但是怎么传到前端遇到了问题,前端的success方法打印不出来,想请教你代码哪儿出错了,我在理提问了http://www.wxappclub.com/topic/1769,楼主如果能抽空看一下,一定感激不尽:sob:
    逆_旅:@一斤代码 将数据保存到mongodb里 用user.save()
    一斤代码:其次,else这块的最后:

    var user = new User({
    openid: data.openid,
    nickName: param.nickname,
    avatarUrl: param.head_img,
    creatAt: param.creatAt,
    token: createToken()
    })
    return user.save();
    为什么是 return user.save();呢?这块的写法也是不对的,你应该res.json输出内容才对吧
    一斤代码:首先,调用你的代码中的/login接口,会成功进入下面这块代码么?console中能打印出相应的信息么?
    if (info) {
    console.info('用户已经存在');
    console.info(info.token)
    return res.send(token);
    }
  • 胡萝卜须摇头玩:作者你好,将session_key和openid作为值存入redis中后,在后续的客户端请求中,从redis中查找是否有请求参数sessionid的存在,这样一来session_key和openid是不是就没什么用了呢?那为什么还要存起来呢?
    一斤代码:@胡萝卜须摇头玩 对于后端来说,是这样的。对于小程序端来说,可以调用wx.checkSession()来检查。原则上两端都需要做检查。
    胡萝卜须摇头玩:@一斤代码 这样啊!那第一次登录后,后面只需要判断sessionid是否存在就可以知道是否登录了嘛
    一斤代码:这个地方在redis中session的value不一定要存session_key+openid的,其实可以用任何值。但是存点更有意义的值不是更好么?莫非其他地方要是需要用到这两个值了呢,是吧~~
  • 35b8954b92e5:博主我有一个问题想请教下,小程序本身的sessionKey是有过期时间的,我自己生成的3rd session也是有过期时间,可是这两个的过期时间要怎么同步,比如,
    1、小程序的sessionKey过期了可是我的3rd session没有过期,这个时候拿着老的3rd session还是可以进行相关业务操作,这个时候要怎么同步?
    2、我的3rd session过期了,可是小程序的sessionKey还没过期,这个时候需要重新签发一个新的3rd session吗?
    LG_553c:@一斤代码 我的理解是以session_key 的登陆状态由wx.checkSession() 自己来判断一单过期就要重新登录 ,重新登陆的时候需要更新小程序本地存储的3rdsession 和对应的 服务器的session_key

    同时服务器redis过期时也要告诉前台重新登录,再次更新是这样吗?我不知道如果后台过期了假如设置半个小时过期 那么告诉小程序说过期了,那他重新登录的时候会不会还是提示用户重新登录,不知道后台的redis过期时间设置多少比较合理,上文评价的我们不知道小程序自己的过期时间,微信不告诉我们具体多好,那怎么样设置时间更合理呢
    一斤代码:你可以参考下这个腾讯内部开源的一个相关的项目wafer,看一下它的代码能更加了解一些:https://github.com/tencentyun/wafer
    一斤代码:登录有效性一定是以session_key为先的,3rd session次之。

    - 每次小程序前端调用后端服务前,使用wx.checkSession()来检查微信登录有效性(也就是你说的session_key是否过期);
    - session_key和3rd session任意一个过期,则把两者都重新建立一遍
  • 3fdb581ec682:有个问题想问一下,微信小程序每次获取到的openid都是一样的吗
    一斤代码:在你同一个开发者账号下的应用,用户的openid是一样的。
  • 7ccf4b7bae7d:感谢楼主的分享~这里我有一个不太相关的问题,想请教一下:
    如果希望在退出微信小程序后再次进入,能够回到退出之前的页面(比如用户正在阅读文章,此时有消息,那么暂时退出小程序),可以实现么?
    我这里想了一下,是不是可以在GlobalData里保存当前显示的页面,等到用户再次进入时,从GlobalData中得到页面并重新加载。但是因为微信小程序在进入后台超过5分钟之后就会被销毁,所以这个GlobalData是不是也没有意义了?
    您有什么建议么?非常感谢~~
    7ccf4b7bae7d:@一斤代码 好 我了解了 感谢~
    一斤代码:首先,小程序本身是有将小程序置顶到聊天页面顶部的功能,本来就是为了实现你说的那个场景的。

    如果你还是需要自己来做,那么保存在globalDate里是不可行的。你可以把数据保存在storage里。
  • 692a96708302:博主你好,我们最近做的微信小程序它既有自己的账号密码登录,也有微信号登录。我看了你的博文之后,我在小程序的app.js里面写了判断,就是说如果它判断本地的一个storage值是自己的账号登录还是微信号登录。在IDE上面测试是可以的,但是在手机真机上面测试的时候,关闭了小程序再把微信在后台杀掉之后,再进去就不行了。博主你能说说这种应该怎么判断登录态吗?
    一斤代码:@你听得到_15ed
    1. 可以肯定的是,杀掉微信进程后,storage里面的值是不会被清空的,只有把这个微信小程序删除的情况下,才会清空storage值。
    2. 你从storage里面获取了这个状态值,如果它是weixin或是sk,你会做什么处理?会有后续的登录操作么?
    692a96708302:@一斤代码
    再进去就是说,我在真机上,退出小程序,然后再到后台杀掉微信的进程。再进小程序的时候,它就又要我登陆了。我不知道是不是在杀掉微信进程后,存的storage的值也会被清空
    我在storage里面存的就是一个状态值,weixin代表用户上一次是微信登陆,sk代表上一次是自己的账号密码登陆。如果这两个值都没取到,就代表没有他的登陆记录,就需要登陆。

    一斤代码:先了解下你这小程序的问题的情况:
    1.你说的“再进去就不行了”,是个什么样的表现?
    2.你在storage中存储的是些什么样的值?
  • 7be7762517f3:个人觉得实际的流程是先checksession,过期了就login,否则直接调用storage
  • 4dd9de0ebbe8:问一个问题,如果3rd_sessionId暴露了, 用户信息是不是就可能泄露
    赞记:@papajo 如果session_key被截了,能用它去直接访问很多微信的服务(包括不是3rd开发的功能),而3rd_sessionid只能盗用3rd开发的那些功能,不知对不对。
    ef217da9db42:@一斤代码 这也是我疑惑的,如果这样的话,和在客户端通信的网络中直接传输session_key的区别似乎不太大,官方建议不要将session_key在网络中传输是为了避免被人拦截盗用,那么现在将session_key封装到了3rd_sessionid中后3rd_sessionid在网络中传输,是不是依然会存在拦截盗用的问题,那么封装的意义似乎不太大了?
    一斤代码:如果一个用户的3rd_sessionid给别人拿到并且它未过期的话,那别人就可以通过使用这个3rd_sessionid模拟该用户,直接调用服务器端API,理论上能获取到所有你的服务器端能提供给小程序客户端的信息,包括用户的一些详细信息。
  • 枼越:博主你好。我最近在做web页同步的小程序开发,我们网站是用cookie来进行登录信息的获取与持续,也不用微信账号登录,就是普通的用户名密码,这样有办法在小程序内维持登录信息吗?
    枼越:恩,谢谢了
    一斤代码:这样的话,你们原有的API需要改造一下,或者干脆为小程序登录写一个新的登录API,因为小程序里不支持cookie机制。不过有它的本地storage可以来替代cookie,可以基于这一点功能进行重写或改造。
  • f48dac656cff:大神你好,看了你的文章感觉比官方doc清晰多了。不过现在有两个问题想请教一下,1.服务端redis维护的session是永久的还是有时效性的呀? 2.我现在有一个想法是(不考虑安全性),第一次登录,服务端把openid跟随userinfo存入mysql数据库, 客户端拿到openid存到globalData,之后request的时候带上openid,这样客户端和服务端都不用维护登录状态了,不知道这样是否可行?(说话有点啰嗦,不好意思哈)
    f48dac656cff:很感谢你的讲解~
    一斤代码:1.redis中维护的session肯定是临时的,一般设置半个小时到几个小时过期。
    2.你这种方法在不考虑安全性的前提下,也是可以达到功能的啦。
  • a6d482bf3180:你好,请问,这里的checkSession()是检查用户微信账户在微信的登录态么?
    自己维护的session用于维护用户在小程序中的登录态么?
    一斤代码:@xcchcaptain 比较严谨的做法确实是需要每次检查客户端登录态的,就如同我们的服务器端其实也是每次会进行session的有效性检查。

    你可以参考下腾讯的一个开源小程序维持会话的客户端SDK的源码和做法(https://github.com/tencentyun/wafer-client-sdk),就可以进一步了解了。
    a6d482bf3180:@一斤代码 你好,感谢您的回复,那么,对于客户端登录态有效, 而后台维护的登录态已经失效,也就是session过期的情况。该怎么处理比较妥当。是否对于需要登录的操作,每次都要及检查客户端登录态,又要检查后端的登录态呢
    一斤代码:@xcchcaptain 应该这么理解:checkSession检查的是微信账户在小程序客户端中的登录态,而自己后端维护的session是该微信账户在你服务器端中的登录态。
  • Yi罐可乐:首先感觉题主,写的很好,然后有个问题:
    假设我的小程序有 5 个页面,每个页面都必须让用户已登录状态访问,这样的话,我是不是得给每个页面写一个「先检查是否登录,如果未登录的话,发起登录」的逻辑,一共写五次?
    一斤代码:@Yi罐可乐 用这个微信开发者工具的模拟器来调试,但是写代码的话我都用VS Code
    Yi罐可乐:@一斤代码 实际编码肯定不会这么搞,哈哈。顺便问下你用的官网的开发者工具来写小程序吗?感觉太痛苦了。
    一斤代码:理论上来说,是这样的。但是实际编码的时候,肯定不会这样重复的写。登录状态你可以在一个全局的地方统一维护,这套检查和登录的流程也可以包装成一个function,方便其他地方调用。
  • e073a4e78999:博主你好!那如果用户退出微信,或是卸掉微信重新安装了,亦或是换手机了…… 岂不是这第三种方法就失效了?只能用第一、第二种方法了?
    一斤代码:@watsonqu 你这个理解应该是不正确的。

    不管你改微信的各种信息也好,还是退出了重新登录微信也好,只要是同一个微信号,它是有唯一标识的(unionId / openId),所以可以根据这个ID去准确匹配从小程序中拿到的用户信息和你数据库中的用户信息的。

    你可以再仔细想一下。
    e073a4e78999:谢谢博主回复!比如说,当用户退出小程序不用了,在更改微信昵称、图像.....后,卸载微信再安装或换了手机,再重新登录微信,打开小程序而“获取到的微信登录用户信息”就跟上一次“获取到的微信登录用户信息”是不一样的;而之前保存在自己数据库的“用户数据”就无法进行比对了。不知道我说得对不对。还请解惑。
    一斤代码:用这种方式登录后,你可以把获取到的微信登录用户信息,转化成你自己系统里的一个用户数据保存在你的数据库里,做好微信用户与你自己的用户的映射关系就行了。
  • d57341f790d0:你好,我现在也在学一些小程序的开发,能不能结合小程序生命周期说一下登陆状态维护?因为按照我的理解onload里放入登陆和获取用户信息的调用,这个数据就会一直存在,那session过期是在onshow里面做的检查么?
    一斤代码:checkSession的操作一般会在每次和后台交互前进行检查(腾讯官方的相关项目wafer就是这么处理的)。当然如果你想检查的更细致一些,你也可以在onshow里面做检查。
  • drodata:我参考你的文章,使用第三种登录方式,成功将微信用户 openid 和我们自己系统的账号绑定。只是有一点不太明白,我想做的小程序的所有功能都以登录为前提,游客访问会跳转至绑定页面。这样造成的现象就是这个小程序看上去只有一个绑定页面,那么微信怎么审核这个小程序呢?审核的时候,需要提供给微信一个测试账号?谢谢。
    drodata:@一斤代码 多谢指出,我马上补补课,看一下这个运营规范,之前只顾看开发文档了。
    一斤代码:是的,审核的时候你需要提供给他们测试账号,这个在《微信小程序平台运营规范》中的第二部分第9.5条明确说明了的:

    “9.5若小程序中存在帐号关系或付费内容,需提供测试号,包含帐号和密码,保证审核者可以体验所有功能。”
  • 1cb641179bb1:很有帮助,多谢~

本文标题:微信小程序中用户登录和登录态维护

本文链接:https://www.haomeiwen.com/subject/itjmbttx.html