1. 程式人生 > >微信小程式:登陸獲取使用者資訊,包括維護3rdSession。(Node.js-Koa)

微信小程式:登陸獲取使用者資訊,包括維護3rdSession。(Node.js-Koa)

前兩三個月最常見的問題就是登陸模組的問題了。自己也改了好幾次登陸的問題,從普通登陸,一直改到維護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 = "[email protected]#@@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就可以。

 

寫程式碼年份不夠,不夠淳,不喜勿噴。