37 lines
1.8 KiB
JavaScript
37 lines
1.8 KiB
JavaScript
import { SignatureV4 } from "@smithy/signature-v4";
|
|
export const SESSION_TOKEN_QUERY_PARAM = "X-Amz-S3session-Token";
|
|
export const SESSION_TOKEN_HEADER = SESSION_TOKEN_QUERY_PARAM.toLowerCase();
|
|
export class SignatureV4SignWithCredentials extends SignatureV4 {
|
|
async signWithCredentials(requestToSign, credentials, options) {
|
|
const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);
|
|
requestToSign.headers[SESSION_TOKEN_HEADER] = credentials.sessionToken;
|
|
const privateAccess = this;
|
|
setSingleOverride(privateAccess, credentialsWithoutSessionToken);
|
|
return privateAccess.signRequest(requestToSign, options ?? {});
|
|
}
|
|
async presignWithCredentials(requestToSign, credentials, options) {
|
|
const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);
|
|
delete requestToSign.headers[SESSION_TOKEN_HEADER];
|
|
requestToSign.headers[SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;
|
|
requestToSign.query = requestToSign.query ?? {};
|
|
requestToSign.query[SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;
|
|
const privateAccess = this;
|
|
setSingleOverride(privateAccess, credentialsWithoutSessionToken);
|
|
return this.presign(requestToSign, options);
|
|
}
|
|
}
|
|
function getCredentialsWithoutSessionToken(credentials) {
|
|
return {
|
|
accessKeyId: credentials.accessKeyId,
|
|
secretAccessKey: credentials.secretAccessKey,
|
|
expiration: credentials.expiration,
|
|
};
|
|
}
|
|
function setSingleOverride(privateAccess, credentialsWithoutSessionToken) {
|
|
const currentCredentialProvider = privateAccess.credentialProvider;
|
|
privateAccess.credentialProvider = () => {
|
|
privateAccess.credentialProvider = currentCredentialProvider;
|
|
return Promise.resolve(credentialsWithoutSessionToken);
|
|
};
|
|
}
|