# 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 接入能力强制所有请求降级。