微信小程序自带的授权太麻烦,没搞明白结合我自己的业务处理session,只用它处理微信的那一套,授权获取用户信息,获取openid等,自己的业务逻辑都走的自己的session
,我服务端用的是koa2
,session中间件
用的是koa-session-minimal && koa-mysql-session
跟大多数框架处理session问题一样,服务端向客户端种下cookie,客户端请求会带给服务端。
对于前后端分离项目无法跨域种cookie怎么处理,前一篇nodejs(koa2)+vue2前后端分离项目解决session跨域丢失问题给了解决方法,但是小程序没有浏览器,没有bom,dom,怎么处理呢?
开始的思路是后端把sessionid以参数的形式在登录的时候返回给客户端,客户端自己存储,然后在请求的时候再以参数的形式带上来,服务端再处理,这也是app通用的做法,但是在我的项目中需要改中间件,最后还是放弃了
采取了下面的做法,在查资料过程中,小程序中虽然不能存取cookie,但是我发现wx.request请求回来的数据header中是可以拿到服务端返回的sessionid的,同样发送请求也可以设置header请求头的。
于是有了下面的方法:服务端不需要修改session机制
小程序端处理:
每次登陆前先清除sessionid,然后从header中获取存储到本地
wx.login({
success:function(rs){
wx.removeStorageSync('sessionid') //必须先清除,否则res.header['Set-Cookie']会报错
api.getData(<code class="prettyprint" >/op/wxLogin?code=${rs.code}
,"POST",res.userInfo).then((res)=>{
//登录&&创建用户
let sessionid = res.header['Set-Cookie']
sessionid = sessionid.match(/=(\S*);/)[1]
wx.setStorageSync('sessionid',sessionid)
})
}
})
在封装的请求中再把sessionid写入header头中带上去,我把wx.request二次封装了,代码全贴出来
module.exports.zmajax = function (url) {
var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'POST';
var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var header = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { 'content-type': 'application/json' };
var Host = 'http://192.168.2.113:8086'
var session_id = wx.getStorageSync('sessionid');//本地取存储的sessionid
if (session_id != "" && session_id != null) {
header = { 'content-type': 'application/json', 'Cookie': 'sessionid=' + session_id }
}
return new Promise(function (resolve, reject) {
wx.request({
url: Host + url,
data: data,
method: method,
header: header,
withCredentials:true,
success: function (res) {
resolve(res)
},
fail: function (res) {
reject(res)
}
})
})
}
好了,到这里服务端就可以正常获取session了