Javascript 在ServiceNow中使用ES5(仅使用CDN库)签署HTTP请求

Javascript 在ServiceNow中使用ES5(仅使用CDN库)签署HTTP请求,javascript,oracle,ecmascript-5,sign,servicenow,Javascript,Oracle,Ecmascript 5,Sign,Servicenow,我需要通过调用提供的Oracle REST API来创建(PAR)。API需要对POST HTTP请求进行签名,这可以通过库轻松完成 然而,我面临的困难是,我需要在ServiceNow(版本“Paris”)中构建和签署HTTP请求,在该版本中,只有ES5可用,第三方脚本只能通过CDN导入 目前,我试图对签名步骤进行反向工程,但整个过程非常繁琐(因为涉及到许多其他依赖项),而且看起来并不正确。 有人知道我可以使用JS库签署HTTP请求,并且可以通过CDN访问吗? Oracle博客的签名要求: OC

我需要通过调用提供的Oracle REST API来创建(PAR)。API需要对POST HTTP请求进行签名,这可以通过库轻松完成

然而,我面临的困难是,我需要在ServiceNow(版本“Paris”)中构建和签署HTTP请求,在该版本中,只有ES5可用,第三方脚本只能通过CDN导入

目前,我试图对签名步骤进行反向工程,但整个过程非常繁琐(因为涉及到许多其他依赖项),而且看起来并不正确。
有人知道我可以使用JS库签署HTTP请求,并且可以通过CDN访问吗?

Oracle博客的签名要求:

OCI API需要以下默认标题:主机、日期,(请求类型)。(请求类型)报头是一个特殊的报头,可以通过连接小写HTTP方法、anASCII空间和请求的URI路径来生成。对于POST和PUT方法,除了默认的头之外,OCI API还需要以下3个额外的头:内容类型、内容长度、x-content-sha256。内容类型和内容长度是HTTP正文的类型和长度,x-conent-sha256头是HTTP正文文本输入格式的SHA-256哈希

下面是我迄今为止构建的代码,其中只缺少签名步骤:

var promise = require("es6-promise");  // CDN
require("isomorphic-fetch");           // CDN
promise.polyfill();
var jsSHA = require("./jssha.js");     // CDN

function signRequest(request, body) {
    headersToSign = [
        "Host",
        "Date",
        "(request-target)"
    ];
    request.setHeader("Host", host);
    request.setHeader("Date", new Date().toUTCString());
    request.setHeader("(request-target)", `POST ${api_endpoint}`);

    var body_string = JSON.stringify(body);

    // Create a Hasher object
    var shaObj = new jsSHA("SHA-256", "TEXT");
    shaObj.update(body_string);

    request.setHeader("Content-Length", body_string.length);
    request.setHeader("x-content-sha256", shaObj.getHash('B64'));

    headersToSign = headersToSign.concat([
        "content-type",
        "content-length",
        "x-content-sha256"
    ]);

    /* Using httpSignature I could easily sign the request here.
       I would need a similar library available via CDN and ES5 compatible to replace httpSignature sign step.
    */
    // ---------- SIGN METHOD TO SUBSTITUTE  -------------
    // httpSignature.sign(request, {
    //     key: privateKey,
    //     keyId: keyId,
    //     headers: headersToSign
    // });
    // ---------------------------------------------------    


    let newAuthHeaderValue = request.getHeader("Authorization").replace("Signature ", "Signature version=\"1\",");
    request.setHeader("Authorization", newAuthHeaderValue);

    return request;
}


var generatePAR = (async () => {

    // 1. Create HttpRequest to be signed
    var httpRequest = {
        uri: `${api_endpoint}/n/${namespaceName}/b/${bucketName}/`,
        headers: new Headers(),
        method: "POST",
        body: {
            accessType: "ObjectRead",
            name: Date.now().toString(),
            objectName: filePath,
            timeExpires: duration
        }
    };

    // 3. sign request
    var signedRequest = signRequest(httpRequest, httpRequest.body);

    // 4. Make the call
    var response = await fetch(
        new Request(signedRequest.uri, {
            method: signedRequest.method,
            headers: signedRequest.headers,
            body: signedRequest.body
        })
    );

    // 5. Test the response
    console.log(await response.json());
})();
我已经看到servicenow正在验证HTTP请求,但似乎不可能指定Oracle云所需的所有参数