收藏
回答

小程序服务端缓存用户登录状态,获取不到登录状态值

koa2写的后端,在wx.login后,在后端接口中返回openid+session_key的值返回给客户端。同时在服务端也缓存这个数据,用来验证用户的登录状态:部分代码如下:


//app.js中的,用来做服务端缓存

const session = require('koa-session-minimal');

const MysqlStore = require('koa-mysql-session');

//session配置

const sessionMySqlConfig = config; //链接数据库的配置

//配置session中间件

app.use(session({

key: 'token',

store: new MysqlStore(sessionMySqlConfig),

cookie: {

maxAge: 888888888,

httpOnly: true,

overwrite: true

}

}))


第一次进到小程序,调用登录接口,从服务端拿到下面返回的token,并缓存在客户端:


router.post('/login', async (ctx, next) => {

let code = ctx.request.body.code;

let appId = 'wx432075f5c1fe4e16';

let appSecret = '045923dbf4a8cf8011e62c649cca68d2';

let url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`;

let res = await koa2Req(url);

let body = JSON.parse(res.body);

let userToken = body.openid + body.session_key;

// 这一步我看了,使用koa-session-minimal和koa-mysql-session,确实把userToken存到数据库里了。

ctx.session.token = userToken;

ctx.state.data = userToken; //这个值客户端也收到了

})


//其它一个接口(和登录不在一个模块中) ,请求服务端,想实现---只有在用户登录状态还有效的情况下才能请求成功。

router.get('/articleList', async (ctx, next) => {

let selectStr = 'select * from articlelist';

let result = await connection.query(selectStr);

console.log(ctx.session.token); // -----------这里是要获取的token----------- 结果获取为空。 为什么????

ctx.state.data = JSON.parse(JSON.stringify(result));

})





回答关注问题邀请回答
收藏

2 个回答

  • Hansen
    Hansen
    2018-06-22

    我想的是这样:首次进到小程序页面,wx.login()发送code到我们的后端,我们的后端发送请求到微信服务端获取openid和session_key,我们的后端使用redis缓存openid+session_key的值,并将openid+session_key的值通过jwt处理返回给前端缓存起来(服务端设置过期时间2h),以后前端需要登录的请求头里带上这个值到服务端判断是否是登录状态。两种情况:1.如果过期的话,后端经过jwt会自动返回登录已过期的回复,然后前端重新登录更新后端的openid和session_key。2.未过期,从request的头里取出发送给客户端的值(通过jwt生成的,也是服务端用来判断是否是登陆状态的依据),这个值通过jwt解密,将解密出的值与redis里的值比较,1.相同的话证明是合法登录,可进行后续操作 2.解密出空值或者两者不同的话,话证明不是合法的登录。


    请教一下,这样判断合理不


    流程图:



    2018-06-22
    有用
    回复
  • Zoelov
    Zoelov
    2018-06-21

    没看懂你这是什么意思,不过我觉得有个问题:

    1. openid和sessionkey不要直接传给客户端,这最好始终保存在服务端。


    你可以用缓存,将openid和sessionkey缓存到服务端,并返回与之对应的uuid给客户端,客户端向后端发起请求的时候,在header中都要带上此uuid,来验证是哪一个用户,以及是否登录过期。

    2018-06-21
    有用
    回复 4
    • Hansen
      Hansen
      2018-06-21

      1.openid和session用什么缓存,需要写到数据库里吗? 需要缓存什么字段作为用户登录态,用什么缓存呢。另外微信服务端并没有返回uuid。新手一枚,请不吝赐教

      2018-06-21
      回复
    • Zoelov
      Zoelov
      2018-06-21回复Hansen

      比如说用redis啊,设置个过期时间。这个uuid,当然是你自己生成的啊,就是key-value啊,key就是uuid,value就是openid和session

      2018-06-21
      回复
    • Hansen
      Hansen
      2018-06-21

      redis没用过,能分享下代码吗,弄了几天都没搞好

      2018-06-21
      回复
    • Zoelov
      Zoelov
      2018-06-22回复Hansen

      我只是举个例子,你也可以用其他的key-value数据库,其实,用什么都无所谓,你只需要实现到了过期时间,自动消失就行了。而且,我的代码都是go语言的。

      你最好先把官方的那个流程图看明白,然后再想用什么工具来实现。

      2018-06-22
      1
      回复
登录 后发表内容