Skip to content

Commit 2a58ea5

Browse files
author
mishasychev
committed
feat s3api: support aws signature v4
commit_hash:98e7054204568f698d3604a4120c01c320721350
1 parent af7b86c commit 2a58ea5

12 files changed

Lines changed: 636 additions & 54 deletions

File tree

.mapping.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3321,6 +3321,7 @@
33213321
"libraries/s3api/CMakeLists.txt":"taxi/uservices/userver/libraries/s3api/CMakeLists.txt",
33223322
"libraries/s3api/include/userver/s3api/authenticators/access_key.hpp":"taxi/uservices/userver/libraries/s3api/include/userver/s3api/authenticators/access_key.hpp",
33233323
"libraries/s3api/include/userver/s3api/authenticators/interface.hpp":"taxi/uservices/userver/libraries/s3api/include/userver/s3api/authenticators/interface.hpp",
3324+
"libraries/s3api/include/userver/s3api/authenticators/signature_v4.hpp":"taxi/uservices/userver/libraries/s3api/include/userver/s3api/authenticators/signature_v4.hpp",
33243325
"libraries/s3api/include/userver/s3api/authenticators/utils.hpp":"taxi/uservices/userver/libraries/s3api/include/userver/s3api/authenticators/utils.hpp",
33253326
"libraries/s3api/include/userver/s3api/clients/fwd.hpp":"taxi/uservices/userver/libraries/s3api/include/userver/s3api/clients/fwd.hpp",
33263327
"libraries/s3api/include/userver/s3api/clients/s3api.hpp":"taxi/uservices/userver/libraries/s3api/include/userver/s3api/clients/s3api.hpp",
@@ -3333,6 +3334,8 @@
33333334
"libraries/s3api/include/userver/s3api/models/secret.hpp":"taxi/uservices/userver/libraries/s3api/include/userver/s3api/models/secret.hpp",
33343335
"libraries/s3api/library.yaml":"taxi/uservices/userver/libraries/s3api/library.yaml",
33353336
"libraries/s3api/src/s3api/authenticators/access_key.cpp":"taxi/uservices/userver/libraries/s3api/src/s3api/authenticators/access_key.cpp",
3337+
"libraries/s3api/src/s3api/authenticators/signature_v4.cpp":"taxi/uservices/userver/libraries/s3api/src/s3api/authenticators/signature_v4.cpp",
3338+
"libraries/s3api/src/s3api/authenticators/signature_v4_test.cpp":"taxi/uservices/userver/libraries/s3api/src/s3api/authenticators/signature_v4_test.cpp",
33363339
"libraries/s3api/src/s3api/authenticators/utils.cpp":"taxi/uservices/userver/libraries/s3api/src/s3api/authenticators/utils.cpp",
33373340
"libraries/s3api/src/s3api/authenticators/utils_test.cpp":"taxi/uservices/userver/libraries/s3api/src/s3api/authenticators/utils_test.cpp",
33383341
"libraries/s3api/src/s3api/clients/client.cpp":"taxi/uservices/userver/libraries/s3api/src/s3api/clients/client.cpp",

libraries/s3api/include/userver/s3api/authenticators/access_key.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class AccessKey : public Authenticator {
2020
secret_key_{std::move(secret_key)}
2121
{}
2222
std::unordered_map<std::string, std::string> Auth(const Request& request) const override;
23-
std::unordered_map<std::string, std::string> Sign(const Request& request, time_t expires) const override;
23+
std::unordered_map<std::string, std::string> Sign(const Request& request, std::time_t expires) const override;
2424

2525
private:
2626
std::string access_key_;

libraries/s3api/include/userver/s3api/authenticators/interface.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace authenticators {
2121
/// @brief Base class for all authenticators - classes that sign the request with auth data
2222
struct Authenticator {
2323
virtual std::unordered_map<std::string, std::string> Auth(const Request& request) const = 0;
24-
virtual std::unordered_map<std::string, std::string> Sign(const Request& request, time_t expires) const = 0;
24+
virtual std::unordered_map<std::string, std::string> Sign(const Request& request, std::time_t expires) const = 0;
2525
virtual ~Authenticator() = default;
2626
};
2727

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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+
13+
USERVER_NAMESPACE_BEGIN
14+
15+
namespace 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
25+
class SignatureV4 : public Authenticator {
26+
public:
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
37+
/// presigned URL stops being valid, the same way as in
38+
/// @ref AccessKey::Sign. It is converted to the `X-Amz-Expires` duration
39+
/// relative to the current time.
40+
std::unordered_map<std::string, std::string> Sign(const Request& request, std::time_t expires) const override;
41+
42+
private:
43+
std::string access_key_;
44+
Secret secret_key_;
45+
std::string region_;
46+
std::string service_;
47+
};
48+
49+
} // namespace s3api::authenticators
50+
51+
USERVER_NAMESPACE_END

libraries/s3api/src/s3api/authenticators/access_key.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ std::unordered_map<std::string, std::string> AccessKey::Auth(const Request& requ
3838
return auth_headers;
3939
}
4040

41-
std::unordered_map<std::string, std::string> AccessKey::Sign(const Request& request, time_t expires) const {
41+
std::unordered_map<std::string, std::string> AccessKey::Sign(const Request& request, std::time_t expires) const {
4242
static const std::string kExpires{"Expires"};
4343
static const std::string kSignature{"Signature"};
4444
static const std::string kAWSAccessKeyId{"AWSAccessKeyId"};

0 commit comments

Comments
 (0)