# hook xhr 接入安全网关
# 一、接入指南
# 1. 使用ajax-hook
<script src="https://unpkg.com/ajax-hook@3.0.3/dist/ajaxhook.min.js"></script>
# 2. 新建一个 gwpatch.js 文件
内容如下,修改其中的 GATEWAY_DOMAIN
字段为自己的网关域名,以及 resoureceAppid
(填任意一个小程序白名单内的 appid
即可,仅作为来源区分,不校验),其中 RESOLVE_GATEWAY_DOMAIN
为 需要加入到网关转发的域名。
const c1 = new cloud.Cloud({
identityless: true,
resourceAppid: '***', // appid,填入接入的小程序 appid
config: {
customDomain: 'https://a1d5ad78d-***.sh.wxcloudrun.com' // 网关接入节点域名
}
})
c1.init() // 初始化实例
const gateway = c1.services.Gateway({ domain: 'a1d5ad78d-****.sh.wxcloudrun.com' }) // 网关接入节点域名,不包含协议头
const RESOLVE_GATEWAY_DOMAIN = ["https://domain/"]
const GWFALLBACK=true
const UNPARSE_JSON = false //控制是否强制解json,true 时为不解json,返回为 string 格式
const UNPARES_URL_PERFIX = RESOLVE_GATEWAY_DOMAIN //配置是否解 json的路径
function checkDomain(ob1,ob2){
for (var i=0;i<ob1.length;i++)
{
if(ob2.startsWith(ob1[i])>0){
return true
}
}
return false
}
ah.proxy({
onRequest: (config, handler) => {
//config = sigcrypto(config) //加签逻辑
if (checkDomain(RESOLVE_GATEWAY_DOMAIN,config.url) ) {
let nheader = config.headers
nheader["X-WX-HTTP-MODE"]= 'REROUTE'
gateway.call({
method:config.method,
path:config.url,
header:nheader,
data:config.body,
apiVersion:3,
}
).then(res => {
if (UNPARSE_JSON && checkDomain(UNPARES_URL_PERFIX,config.url) && res.header['content-type']=='application/json'){
res.data = JSON.stringify(res.data)
}
if (res.errMsg=="gateway.call:ok"){
handler.resolve(
{
config:config,
status:res.statusCode,
response:res.data,
headers:res.header
}
)
}else{
if (GWFALLBACK){
handler.next(config)
}else{
handler.resolve(
{
config:config,
status:res.statusCode,
response:res.data,
headers:res.header
}
)
}
}
}).catch((error)=>{
if (GWFALLBACK){
handler.next(config)
}else{
handler.resolve(
{
config:config,
status:error.errCode,
response:error.errMsg
}
)
}
})
} else {
handler.next(config);
}
}
})
# 3. 在 HTML 中引入安全网关 Web SDK 和hook SDK
<script src="https://该地址隐藏,请前往控制台获取/cloud.js" importance="VeryHigh"></script>
<script src="./ajaxhook.min.js"></script>
<script src="gwpatch.js"></script>
# 4. 引入成功后,所有xhr 请求将会自动牵引至 websdk
# 5. 测试请求是否正常,以及请求是否通过加密即可。注意 2.0.4 的 SDK 不允许打开 DevTools 调试工具,否则将被拦截。
# 二、FAQ
# 1. 降级能力,能否自定义?
可以通过上面的 wxadapter 的 catch 部分自定义进入降级的条件。
# 2. 如何快速关闭?
步骤 3 入口处取消掉 adapter 的应用即可。
# 3. 是否支持服务端主动降级
上面代码中,默认任何报错都会进行降级,也可以通过控制台关闭网关的 Web 接入能力强制所有请求降级。