userver: userver/s3api/authenticators/signature_v4.hpp Source File
Loading...
Searching...
No Matches
signature_v4.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/s3api/authenticators/signature_v4.hpp
4/// @brief Authenticator implementing AWS Signature Version 4
5
6#include <string>
7#include <unordered_map>
8
9#include <userver/s3api/authenticators/interface.hpp>
10#include <userver/s3api/models/fwd.hpp>
11#include <userver/s3api/models/secret.hpp>
12
13USERVER_NAMESPACE_BEGIN
14
15namespace s3api::authenticators {
16
17/// @brief Authenticator implementing AWS Signature Version 4.
18///
19/// `Auth` signs a request with headers (`Authorization`, `X-Amz-Date`,
20/// `X-Amz-Content-Sha256`), `Sign` produces query parameters for a presigned
21/// URL (`X-Amz-Algorithm`, `X-Amz-Credential`, `X-Amz-Date`, `X-Amz-Expires`,
22/// `X-Amz-SignedHeaders`, `X-Amz-Signature`).
23///
24/// See https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html
25class SignatureV4 : public Authenticator {
26public:
27 SignatureV4(std::string access_key, Secret secret_key, std::string region, std::string service = "s3")
28 : access_key_{std::move(access_key)},
29 secret_key_{std::move(secret_key)},
30 region_{std::move(region)},
31 service_{std::move(service)}
32 {}
33
34 std::unordered_map<std::string, std::string> Auth(const Request& request) const override;
35
36 /// @note `expires` is an absolute unix timestamp of the moment the presigned URL stops being valid.
37 /// It is converted to the `X-Amz-Expires` duration relative to the current time.
38 std::unordered_map<std::string, std::string> Sign(const Request& request, std::time_t expires) const override;
39
40private:
41 std::string access_key_;
42 Secret secret_key_;
43 std::string region_;
44 std::string service_;
45};
46
47} // namespace s3api::authenticators
48
49USERVER_NAMESPACE_END