版权声明:转载请标明出处。 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就可以。
写代码年份不够,不够淳,不喜勿喷。