微信小程式:登陸獲取使用者資訊,包括維護3rdSession。(Node.js-Koa)
阿新 • • 發佈:2018-11-17
前兩三個月最常見的問題就是登陸模組的問題了。自己也改了好幾次登陸的問題,從普通登陸,一直改到維護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就可以。
寫程式碼年份不夠,不夠淳,不喜勿噴。