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回答
提交回答
  • 至过去的我

    2044人对此回答表示赞同

    我是未来的你,你现在是不是在年找寻小程序答案。你不要感觉诧异,给你来信原因,就是让你不在后悔。今天去学习如何推广小程序,相信......点击查看更多>
    发布于
  • Foster

    8人对此回答表示赞同

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

    展开
    8
    4回复
    发布于 6年前

    评论(4)

    收起评论

    • Jace 2019-01-22 12:36

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

      回复
    • 加一+1 2019-01-24 10:55

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

      回复
    • Cameron小帅哥 2019-01-26 22:45

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

      回复
    • Raimundo 2019-01-28 17:00

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

      回复
  • Zoey

    6人对此回答表示赞同

    我想的是这样:首次进到小程序页面,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.解密出空值或者两者不同的话,话证明不是合法的登录。

    展开
    6
    0回复
    发布于 6年前

    评论(0)

    收起评论

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
咨询热线

13312967497

扫码添加业务即可随时咨询 还可领取小程序推广攻略

业务咨询: 13312967497
扫码咨询

扫码咨询套餐

回到顶部