微信小程序:登陆获取用户信息,包括维护3rdSession。(Node.js-Koa)

版权声明:转载请标明出处。 https://blog.csdn.net/qq_42172829/article/details/81944215

前两三个月最常见的问题就是登陆模块的问题了。自己也改了好几次登陆的问题,从普通登陆,一直改到维护3rdSession。(token)

普通登陆:用户数据包括appid,secret全部暴露在外,相对来说不安全。

上前台代码块:

wxml

<button open-type='getUserInfo' lang='zh_CN' bindgetuserinfo='onGetUserInfo'>使用微信登陆</button>

JS:由于用于解析用户数据的三个参数是必要的,也只能前台拿,先进行login,getUserinfo 操作获取{code,encrypteData,iv}参数。注意:由于encrypteData参数中有敏感字符(+)使用header:'Content-Type': 'application/json', 做请求防止参数信息遗漏。

util.Request_json是进行封装过的wx.requst请求。在上篇文章中有详细代码。

将获取三个参数装进集合,由请求携带到后台。

onGetUserInfo: function() {
    wx.showLoading({
      title: '登陆中~',
    })
    wx.login({
      success: function(code_s) {
        wx.getUserInfo({
          success: function(userInfos) {
            var data = {
              json_code: code_s.code,
              EncryptedData: userInfos.encryptedData,
              IV: userInfos.iv
            }
            util.Requests_json(config.service.getUser3rdSession, data).then((res) => {
              wx.setStorageSync("UserInfos3rdSession_Token", res)
              wx.hideLoading()
            })
          }
        })
      }
    })
  }

node.js Koa: GET请求跟POST请求获取参数有些差异,

GET:ctx.query.参数名

POST:ctx.requst.body.参数名

/**
 * @param {*} ctx 
 * 获取登陆请求携带code参数。
 */
async function getlogin(ctx) {
    var login_code = ctx.request.body.json_code
    var encryptedData = ctx.request.body.EncryptedData
    var iv = ctx.request.body.IV
    await req.getBySession_(login_code, encryptedData, iv, ctx)
}
const mysql = require('./mysql/Db')
const ERRORS = require('./constants').ERRORS
const debug = require('debug')('abc')
const config = require('../config')
const request = require('request-promise')
const jwt = require('jsonwebtoken')
const secret = "SLDLKKDS323ssdd@#@@gf";
const WXBizDataCrypt = require('../src/WXBizDataCrypt')

const appId = config.appId  //APPID 写入config文件引用
const appSecret = config.appSecret    // 同上
/**
 * 获取用户信息,解密
 * @param {*} login_code  登陆code
 * @param {*} encryptedData  解密参数
 * @param {*} iv 解密参数
 * @param {*} ctx 上下文对象
 */
async function getBySession_(login_code, encryptedData, iv, ctx) {
    try {
        // 内部请求获取 session_key  openid
        let session_K = await WeApi(appId, appSecret, login_code)
        var session = JSON.parse(session_K)
        // 解密
        var pc = new WXBizDataCrypt(appId, session.session_key)
        var data = await pc.decryptData(encryptedData, iv)
        // 打印解密对象
        console.log(data)
        // 维护3rdSession 返回给前端,保证数据安全。 
        var threeSession = jwt.sign(session, secret);
        // console.log(threeSession)
        //返回给前端 保存本地储存
        ctx.body = threeSession;
    } catch (err) {
        ctx.body = "服务器异常"
    }
}

// 使用官方接口获取 openid 跟session_key
async function WeApi(appId, appSecret, login_code) {
    options = {
        method: 'GET',
        url: 'https://api.weixin.qq.com/sns/jscode2session',
        qs: {
            appid: appId,
            secret: appSecret,
            js_code: login_code
        }
    };
    let sessionData = await request(options);
    // console.log(sessionData)
    return sessionData
}

使用webtoken维护用户信息,{openid,session_key},  sign 加密成一段字符串 ,verify 解密

一般来说,数据库加入 WXBizDataCrypt,decryptData 解密出来的数据,记录用户信息。

但是根据业务需求来说重要的是 openid 或者是unionid。所以根据自己所需维护token就可以。

写代码年份不够,不够淳,不喜勿喷。

猜你喜欢

转载自blog.csdn.net/qq_42172829/article/details/81944215