Javascript 在ServiceNow中使用ES5(仅使用CDN库)签署HTTP请求
我需要通过调用提供的Oracle REST API来创建(PAR)。API需要对POST HTTP请求进行签名,这可以通过库轻松完成 然而,我面临的困难是,我需要在ServiceNow(版本“Paris”)中构建和签署HTTP请求,在该版本中,只有ES5可用,第三方脚本只能通过CDN导入 目前,我试图对签名步骤进行反向工程,但整个过程非常繁琐(因为涉及到许多其他依赖项),而且看起来并不正确。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
有人知道我可以使用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云所需的所有参数