微信小程序之登录(Node.js-Koa2-本地服务器)
1.登录逻辑
- 调用接口wx.request()将code发送到开发者服务器。
- 在开发者服务器处,将从客户端传递过来的code以及小程序本身的appid和appsecret组合成一段URL:
- 通过算法(可以是当前时间或随机数等等),生成_3rd_session。
- 将openid和session_key封装成JSON对象。
- 生成的_3rd_session作为key,封装好的JSON对象作为value,存储到Redis数据库中,并设置好合适的过期时间。
- 将生成的_3rd_session发送到客户端中。
- 在客户端中,调用接口wx.setStorageSync(),把_3rd_session存入缓存中。
- 完整的登录流程结束。
2.自定义登录态
2.1 登录验证
用户登录后重新进入小程序时,调用接口wx.checkSession()来检测登录态。若有效,则继续进入下一页面;若失效,则重新发起上述的登录流程。
2.2 登录态维护
- 用户已经登录成功,进入下一级页面。
- 用户发起敏感请求(如删除,修改,添加等操作),调用接口wx.request()时,使其携带缓存中的_3rd_session。
- 开发者服务器响应请求前,先到Redis数据库中查询有无键值为_3rd_session的记录。
- 若记录存在并有效,则正常响应请求。
- 若记录不存在或已经失效,则拒绝请求,提醒用户未登录。
3.前期准备
- 获取appsecret:打开 > 登录 > 开发 > 开发设置 > AppSecret。
- Node.js Koa2框架的基本配置,不再赘述。
- Node.js module:redis,koa2-request的基本使用,不再赘述。
4.登录实现(核心代码)
客户端登录:
onMyLogin(){
wx.login({
//获取登录凭证
success: res => {
wx.request({
url: http://127.0.0.1:3000/user/wxlogin, // 登录路由
method: POST,
data: {
// 发送appid,appsecret和code到开发者服务器
"APPID": "wx9215321878b739b6",
"SECRET": "63ec9a12c928611a642144aa5a615fc1",
"JSCODE": res.code
},
header: {
Content-Type: application/x-www-form-urlencoded
},
success(res) {
//将登录凭证_3rd_session存入缓存
wx.setStorageSync("_3rd_session", res.data)
}
})
}
})
}
开发者服务器处理登录请求:
登录态检验的中间件:
const redisClient = require(../db/redis)
loginCheck = async (ctx,next) => {
// 查询数据库,判断_3rd_session是否存在且有效
const res = await redisClient.get(ctx.request.body._3rd_session)
if(res){
ctx.request.body.openid = JSON.parse(res).openid
await next()
}else{
ctx.body = "未登录!"
}
}
module.exports = {
loginCheck
}
上一篇:
uniapp开发微信小程序-2.页面制作
