Skip to content

Commit ec4afff

Browse files
Gazizonokiblinkov
authored andcommitted
Add CredentialsProvider for system service account (SSA) in C++ SDK (#14861)
1 parent fc275ad commit ec4afff

File tree

9 files changed

+116
-13
lines changed

9 files changed

+116
-13
lines changed

ydb/public/api/client/yc_private/iam/iam_token_service.proto

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ service IamTokenService {
1818
// create iam token for service account
1919
rpc CreateForServiceAccount (CreateIamTokenForServiceAccountRequest) returns (CreateIamTokenResponse);
2020

21+
// create iam token for service
22+
rpc CreateForService (CreateIamTokenForServiceRequest) returns (CreateIamTokenResponse);
23+
2124
// create iam token for compute instance
2225
rpc CreateForComputeInstance (CreateIamTokenForComputeInstanceRequest) returns (CreateIamTokenResponse);
2326

@@ -50,6 +53,14 @@ message CreateIamTokenForServiceAccountRequest {
5053
string service_account_id = 1;
5154
}
5255

56+
message CreateIamTokenForServiceRequest {
57+
string service_id = 1;
58+
string microservice_id = 2;
59+
string resource_id = 3;
60+
string resource_type = 4;
61+
string target_service_account_id = 5;
62+
}
63+
5364
message CreateIamTokenForComputeInstanceRequest {
5465
string service_account_id = 1;
5566
string instance_id = 2;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#pragma once
2+
3+
#include <ydb-cpp-sdk/client/iam/common/types.h>
4+
5+
namespace NYdb::inline V3 {
6+
7+
struct TIamServiceParams : TIamEndpoint {
8+
std::string ServiceId;
9+
std::string MicroserviceId;
10+
std::string ResourceId;
11+
std::string ResourceType;
12+
std::string TargetServiceAccountId;
13+
};
14+
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
LIBRARY(client-iam-private-common-include)
2+
3+
INCLUDE(${ARCADIA_ROOT}/ydb/public/sdk/cpp/sdk_common.inc)
4+
5+
SRCS(
6+
types.h
7+
)
8+
9+
PEERDIR(
10+
ydb/public/sdk/cpp/src/client/iam/common
11+
)
12+
13+
END()

ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/iam_private/iam.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include "common/types.h"
4+
35
#include <ydb-cpp-sdk/client/iam/common/types.h>
46

57
namespace NYdb::inline V3 {
@@ -10,4 +12,7 @@ TCredentialsProviderFactoryPtr CreateIamJwtFileCredentialsProviderFactoryPrivate
1012
/// Acquire an IAM token using JSON Web Token (JWT) contents.
1113
TCredentialsProviderFactoryPtr CreateIamJwtParamsCredentialsProviderFactoryPrivate(const TIamJwtContent& param);
1214

15+
/// Acquire an IAM token for system service account (SSA).
16+
TCredentialsProviderFactoryPtr CreateIamServiceCredentialsProviderFactory(const TIamServiceParams& params);
17+
1318
} // namespace NYdb

ydb/public/sdk/cpp/src/client/iam/common/iam.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,19 @@ class TGrpcIamCredentialsProvider : public ICredentialsProvider {
1919
protected:
2020
using TRequestFiller = std::function<void(TRequest&)>;
2121

22+
using TSimpleRpc =
23+
typename NYdbGrpc::TSimpleRequestProcessor<
24+
typename TService::Stub,
25+
TRequest,
26+
TResponse>::TAsyncRequest;
27+
2228
private:
2329
class TImpl : public std::enable_shared_from_this<TGrpcIamCredentialsProvider<TRequest, TResponse, TService>::TImpl> {
2430
public:
25-
TImpl(const TIamEndpoint& iamEndpoint, const TRequestFiller& requestFiller)
31+
TImpl(const TIamEndpoint& iamEndpoint, const TRequestFiller& requestFiller, TSimpleRpc rpc)
2632
: Client(std::make_unique<NYdbGrpc::TGRpcClientLow>())
2733
, Connection_(nullptr)
34+
, Rpc_(rpc)
2835
, Ticket_("")
2936
, NextTicketUpdate_(TInstant::Zero())
3037
, IamEndpoint_(iamEndpoint)
@@ -67,7 +74,7 @@ class TGrpcIamCredentialsProvider : public ICredentialsProvider {
6774
Connection_->template DoRequest<TRequest, TResponse>(
6875
std::move(req),
6976
std::move(cb),
70-
&TService::Stub::AsyncCreate,
77+
Rpc_,
7178
{ {}, {}, IamEndpoint_.RequestTimeout }
7279
);
7380

@@ -142,9 +149,9 @@ class TGrpcIamCredentialsProvider : public ICredentialsProvider {
142149
}
143150

144151
private:
145-
146152
std::unique_ptr<NYdbGrpc::TGRpcClientLow> Client;
147153
std::unique_ptr<NYdbGrpc::TServiceConnection<TService>> Connection_;
154+
TSimpleRpc Rpc_;
148155
std::string Ticket_;
149156
TInstant NextTicketUpdate_;
150157
const TIamEndpoint IamEndpoint_;
@@ -157,8 +164,8 @@ class TGrpcIamCredentialsProvider : public ICredentialsProvider {
157164
};
158165

159166
public:
160-
TGrpcIamCredentialsProvider(const TIamEndpoint& endpoint, const TRequestFiller& requestFiller)
161-
: Impl_(std::make_shared<TImpl>(endpoint, requestFiller))
167+
TGrpcIamCredentialsProvider(const TIamEndpoint& endpoint, const TRequestFiller& requestFiller, TSimpleRpc rpc)
168+
: Impl_(std::make_shared<TImpl>(endpoint, requestFiller, rpc))
162169
{
163170
Impl_->UpdateTicket(true);
164171
}
@@ -186,7 +193,7 @@ class TIamJwtCredentialsProvider : public TGrpcIamCredentialsProvider<TRequest,
186193
: TGrpcIamCredentialsProvider<TRequest, TResponse, TService>(params,
187194
[jwtParams = params.JwtParams](TRequest& req) {
188195
req.set_jwt(MakeSignedJwt(jwtParams));
189-
}) {}
196+
}, &TService::Stub::AsyncCreate) {}
190197
};
191198

192199
template<typename TRequest, typename TResponse, typename TService>
@@ -196,7 +203,7 @@ class TIamOAuthCredentialsProvider : public TGrpcIamCredentialsProvider<TRequest
196203
: TGrpcIamCredentialsProvider<TRequest, TResponse, TService>(params,
197204
[token = params.OAuthToken](TRequest& req) {
198205
req.set_yandex_passport_oauth_token(TStringType{token});
199-
}) {}
206+
}, &TService::Stub::AsyncCreate) {}
200207
};
201208

202209
template<typename TRequest, typename TResponse, typename TService>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <ydb-cpp-sdk/client/iam_private/common/types.h>
2+
3+
#include <src/client/iam/common/iam.h>
4+
5+
namespace NYdb::inline V3 {
6+
7+
template<typename TRequest, typename TResponse, typename TService>
8+
9+
class TIamServiceCredentialsProviderFactory : public ICredentialsProviderFactory {
10+
public:
11+
TIamServiceCredentialsProviderFactory(const TIamServiceParams& params) : Params_(params) {}
12+
13+
TCredentialsProviderPtr CreateProvider() const final {
14+
return std::make_shared<TGrpcIamCredentialsProvider<TRequest, TResponse, TService>>(Params_,
15+
[params = Params_](TRequest& req) {
16+
req.set_service_id(params.ServiceId);
17+
req.set_microservice_id(params.MicroserviceId);
18+
req.set_resource_id(params.ResourceId);
19+
req.set_resource_type(params.ResourceType);
20+
req.set_target_service_account_id(params.TargetServiceAccountId);
21+
}, &TService::Stub::AsyncCreateForService);
22+
}
23+
24+
private:
25+
TIamServiceParams Params_;
26+
};
27+
28+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
LIBRARY()
2+
3+
INCLUDE(${ARCADIA_ROOT}/ydb/public/sdk/cpp/sdk_common.inc)
4+
5+
SRCS(
6+
iam.h
7+
)
8+
9+
PEERDIR(
10+
ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/iam_private/common
11+
ydb/public/sdk/cpp/src/client/iam/common
12+
)
13+
14+
END()

ydb/public/sdk/cpp/src/client/iam_private/iam.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1-
#include <ydb-cpp-sdk/client/iam_private/iam.h>
1+
#include "common/iam.h"
22

3-
#include <src/client/iam/common/iam.h>
3+
#include <ydb-cpp-sdk/client/iam_private/iam.h>
44

55
#include <ydb/public/api/client/yc_private/iam/iam_token_service.pb.h>
66
#include <ydb/public/api/client/yc_private/iam/iam_token_service.grpc.pb.h>
77

8+
using namespace yandex::cloud::priv::iam::v1;
9+
810
namespace NYdb::inline V3 {
911

1012
TCredentialsProviderFactoryPtr CreateIamJwtCredentialsProviderFactoryImplPrivate(TIamJwtParams&& jwtParams) {
1113
return std::make_shared<TIamJwtCredentialsProviderFactory<
12-
yandex::cloud::priv::iam::v1::CreateIamTokenRequest,
13-
yandex::cloud::priv::iam::v1::CreateIamTokenResponse,
14-
yandex::cloud::priv::iam::v1::IamTokenService
14+
CreateIamTokenRequest,
15+
CreateIamTokenResponse,
16+
IamTokenService
1517
>>(std::move(jwtParams));
1618
}
1719

@@ -25,4 +27,12 @@ TCredentialsProviderFactoryPtr CreateIamJwtParamsCredentialsProviderFactoryPriva
2527
return CreateIamJwtCredentialsProviderFactoryImplPrivate(std::move(jwtParams));
2628
}
2729

30+
TCredentialsProviderFactoryPtr CreateIamServiceCredentialsProviderFactory(const TIamServiceParams& params) {
31+
return std::make_shared<TIamServiceCredentialsProviderFactory<
32+
CreateIamTokenForServiceRequest,
33+
CreateIamTokenResponse,
34+
IamTokenService
35+
>>(std::move(params));
36+
}
37+
2838
}

ydb/public/sdk/cpp/src/client/iam_private/ya.make

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ SRCS(
88

99
PEERDIR(
1010
ydb/public/api/client/yc_private/iam
11-
ydb/public/sdk/cpp/src/client/iam/common
11+
ydb/public/sdk/cpp/src/client/iam_private/common
1212
)
1313

1414
END()

0 commit comments

Comments
 (0)