[]).forEach((str) => {
if (str !== 'Path=/;' && str.indexOf('csrfToken=') !== 0) {
__cookies.push(str);
}
});
wx.setStorageSync(COOKIE_KEY, __cookies.join(' '));
};
csrfToken
是接下来配合 Egg.js
用的,Path=/;
在某些应用下会是 path=/;
normalizeUserCookie
主要是过滤了 xx=xxx
; 这样的数据,然后排除 path=/;
这样无意义的数据。
在登录接口的时候,存上 cookie,在接下来的请求中带上,那么,应该、没错、可能、可以模拟了。
配合 Egg.js
Egg 内置的 egg-security
插件默认对所有『非安全』的方法,例如 POST,PUT,DELETE 都进行 CSRF 校验。
Egg.js 虽然可以在配置中关闭 CSRF,但是,如果一定要使用呢?
首先,要弄明白一件事,csrfToken
怎么来的。
经过多次验证得知,当 http 请求时,在约定位置没有携带上 csrfToken 值,此次请求会在返回的 cookie 中携带上一个新的 csrfToken;当本次请求已携带上值,就不会产生成 csrfToken。当约定位置带上的 csrfToken 与 cookie 里面的 csrfToken 一致时,通过验证。
接上面的 格式化用户需要的 cookie
操作,先抛开 csrfToken 单独处理用户状态等。
在每次请求结束后,试着单独拿 cookie 中可能存在的 csrfToken,有值就缓存,没值跳过用旧值。
封装一个 Ajax
本次小程序是基于 wepy 的,所以使用了优化后的 wepy.request
;
基于 Egg.js 的版本。
可能与实际开发有点出入,适当修改。
import wepy from 'wepy';
export const HTTP_HOST = 'http://127.0.0.1:3000';
export const HTTP_HOST_API = `${HTTP_HOST}/api/wxmp`;
// cookie 的本地存储位置
const COOKIE_KEY = '__cookie_key__';
// csrfToken 的本地存储位置
const CSRF_TOKEN_KEY = '__csrf_token__';
/**
* 清除用户Cookie
*/
export const cleanUserCookie = () => {
wx.setStorageSync(COOKIE_KEY, '');
}
/**
* 格式化用户需要的 cookie
* @param {String} cookies
*/
export const normalizeUserCookie = (cookies = '') => {
let __cookies = [];
(cookies.match(/([\w\-.]*)=([^\s=]+);/g) 关键词:微信小程序模拟cookie的完成