Skip to content
Snippets Groups Projects
Commit 29d47230 authored by jboeuf's avatar jboeuf Committed by GitHub
Browse files

Merge pull request #10827 from jboeuf/max_token_lifetime_cpp

Better handling of token lifetime.
parents ac51c2aa da8eca56
No related branches found
No related tags found
No related merge requests found
...@@ -132,13 +132,17 @@ std::shared_ptr<ChannelCredentials> SslCredentials( ...@@ -132,13 +132,17 @@ std::shared_ptr<ChannelCredentials> SslCredentials(
/// services. /// services.
std::shared_ptr<CallCredentials> GoogleComputeEngineCredentials(); std::shared_ptr<CallCredentials> GoogleComputeEngineCredentials();
/// Constant for maximum auth token lifetime.
constexpr long kMaxAuthTokenLifetimeSecs = 3600;
/// Builds Service Account JWT Access credentials. /// Builds Service Account JWT Access credentials.
/// json_key is the JSON key string containing the client's private key. /// json_key is the JSON key string containing the client's private key.
/// token_lifetime_seconds is the lifetime in seconds of each Json Web Token /// token_lifetime_seconds is the lifetime in seconds of each Json Web Token
/// (JWT) created with this credentials. It should not exceed /// (JWT) created with this credentials. It should not exceed
/// \a grpc_max_auth_token_lifetime or will be cropped to this value. /// \a kMaxAuthTokenLifetimeSecs or will be cropped to this value.
std::shared_ptr<CallCredentials> ServiceAccountJWTAccessCredentials( std::shared_ptr<CallCredentials> ServiceAccountJWTAccessCredentials(
const grpc::string& json_key, long token_lifetime_seconds); const grpc::string& json_key,
long token_lifetime_seconds = kMaxAuthTokenLifetimeSecs);
/// Builds refresh token credentials. /// Builds refresh token credentials.
/// json_refresh_token is the JSON string containing the refresh token along /// json_refresh_token is the JSON string containing the refresh token along
......
...@@ -125,6 +125,13 @@ grpc_service_account_jwt_access_credentials_create_from_auth_json_key( ...@@ -125,6 +125,13 @@ grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
gpr_ref_init(&c->base.refcount, 1); gpr_ref_init(&c->base.refcount, 1);
c->base.vtable = &jwt_vtable; c->base.vtable = &jwt_vtable;
c->key = key; c->key = key;
gpr_timespec max_token_lifetime = grpc_max_auth_token_lifetime();
if (gpr_time_cmp(token_lifetime, max_token_lifetime) > 0) {
gpr_log(GPR_INFO,
"Cropping token lifetime to maximum allowed value (%d secs).",
(int)max_token_lifetime.tv_sec);
token_lifetime = grpc_max_auth_token_lifetime();
}
c->jwt_lifetime = token_lifetime; c->jwt_lifetime = token_lifetime;
gpr_mu_init(&c->cache_mu); gpr_mu_init(&c->cache_mu);
jwt_reset_cache(exec_ctx, c); jwt_reset_cache(exec_ctx, c);
......
...@@ -816,6 +816,45 @@ static void on_jwt_creds_get_metadata_failure( ...@@ -816,6 +816,45 @@ static void on_jwt_creds_get_metadata_failure(
GPR_ASSERT(strcmp((const char *)user_data, test_user_data) == 0); GPR_ASSERT(strcmp((const char *)user_data, test_user_data) == 0);
} }
static grpc_service_account_jwt_access_credentials *creds_as_jwt(
grpc_call_credentials *creds) {
GPR_ASSERT(creds != NULL);
GPR_ASSERT(strcmp(creds->type, GRPC_CALL_CREDENTIALS_TYPE_JWT) == 0);
return (grpc_service_account_jwt_access_credentials *)creds;
}
static void test_jwt_creds_lifetime(void) {
char *json_key_string = test_json_key_str();
// Max lifetime.
grpc_call_credentials *jwt_creds =
grpc_service_account_jwt_access_credentials_create(
json_key_string, grpc_max_auth_token_lifetime(), NULL);
GPR_ASSERT(gpr_time_cmp(creds_as_jwt(jwt_creds)->jwt_lifetime,
grpc_max_auth_token_lifetime()) == 0);
grpc_call_credentials_release(jwt_creds);
// Shorter lifetime.
gpr_timespec token_lifetime = {10, 0, GPR_TIMESPAN};
GPR_ASSERT(gpr_time_cmp(grpc_max_auth_token_lifetime(), token_lifetime) > 0);
jwt_creds = grpc_service_account_jwt_access_credentials_create(
json_key_string, token_lifetime, NULL);
GPR_ASSERT(
gpr_time_cmp(creds_as_jwt(jwt_creds)->jwt_lifetime, token_lifetime) == 0);
grpc_call_credentials_release(jwt_creds);
// Cropped lifetime.
gpr_timespec add_to_max = {10, 0, GPR_TIMESPAN};
token_lifetime = gpr_time_add(grpc_max_auth_token_lifetime(), add_to_max);
jwt_creds = grpc_service_account_jwt_access_credentials_create(
json_key_string, token_lifetime, NULL);
GPR_ASSERT(gpr_time_cmp(creds_as_jwt(jwt_creds)->jwt_lifetime,
grpc_max_auth_token_lifetime()) == 0);
grpc_call_credentials_release(jwt_creds);
gpr_free(json_key_string);
}
static void test_jwt_creds_success(void) { static void test_jwt_creds_success(void) {
char *json_key_string = test_json_key_str(); char *json_key_string = test_json_key_str();
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
...@@ -1216,6 +1255,7 @@ int main(int argc, char **argv) { ...@@ -1216,6 +1255,7 @@ int main(int argc, char **argv) {
test_compute_engine_creds_failure(); test_compute_engine_creds_failure();
test_refresh_token_creds_success(); test_refresh_token_creds_success();
test_refresh_token_creds_failure(); test_refresh_token_creds_failure();
test_jwt_creds_lifetime();
test_jwt_creds_success(); test_jwt_creds_success();
test_jwt_creds_signing_failure(); test_jwt_creds_signing_failure();
test_google_default_creds_auth_key(); test_google_default_creds_auth_key();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment