|
|
|
@ -129,6 +129,9 @@ static const char test_signed_jwt_token_type[] = |
|
|
|
|
static const char test_signed_jwt2[] = |
|
|
|
|
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImY0OTRkN2M1YWU2MGRmOTcyNmM5YW" |
|
|
|
|
"U2MDcyZTViYTdnZDkwODg5YzcifQ"; |
|
|
|
|
static const char test_signed_jwt3[] = |
|
|
|
|
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImY0OTRkN2M1YWU2MGRmOTcyNmM6YW" |
|
|
|
|
"U3MDcyZTViYTdnZDkwODg5YzcifR"; |
|
|
|
|
static const char test_signed_jwt_token_type2[] = |
|
|
|
|
"urn:ietf:params:oauth:token-type:jwt"; |
|
|
|
|
static const char test_signed_jwt_path_prefix[] = "test_sign_jwt"; |
|
|
|
@ -1296,6 +1299,16 @@ static char* encode_and_sign_jwt_success(const grpc_auth_json_key* json_key, |
|
|
|
|
return gpr_strdup(test_signed_jwt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static char* encode_and_sign_jwt_with_scope_success( |
|
|
|
|
const grpc_auth_json_key* json_key, const char* /*audience*/, |
|
|
|
|
gpr_timespec token_lifetime, const char* scope) { |
|
|
|
|
if (strcmp(scope, test_scope) == 0) { |
|
|
|
|
validate_jwt_encode_and_sign_params(json_key, scope, token_lifetime); |
|
|
|
|
return gpr_strdup(test_signed_jwt3); |
|
|
|
|
} |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static char* encode_and_sign_jwt_failure(const grpc_auth_json_key* json_key, |
|
|
|
|
const char* /*audience*/, |
|
|
|
|
gpr_timespec token_lifetime, |
|
|
|
@ -1325,7 +1338,7 @@ static void test_jwt_creds_lifetime(void) { |
|
|
|
|
// Max lifetime.
|
|
|
|
|
grpc_call_credentials* jwt_creds = |
|
|
|
|
grpc_service_account_jwt_access_credentials_create( |
|
|
|
|
json_key_string, grpc_max_auth_token_lifetime(), nullptr); |
|
|
|
|
json_key_string, grpc_max_auth_token_lifetime(), nullptr, 0); |
|
|
|
|
GPR_ASSERT(gpr_time_cmp(creds_as_jwt(jwt_creds)->jwt_lifetime(), |
|
|
|
|
grpc_max_auth_token_lifetime()) == 0); |
|
|
|
|
/* Check security level. */ |
|
|
|
@ -1339,7 +1352,7 @@ static void test_jwt_creds_lifetime(void) { |
|
|
|
|
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, nullptr); |
|
|
|
|
json_key_string, token_lifetime, nullptr, 0); |
|
|
|
|
GPR_ASSERT(gpr_time_cmp(creds_as_jwt(jwt_creds)->jwt_lifetime(), |
|
|
|
|
token_lifetime) == 0); |
|
|
|
|
GPR_ASSERT(strncmp(expected_creds_debug_string_prefix, |
|
|
|
@ -1351,7 +1364,7 @@ static void test_jwt_creds_lifetime(void) { |
|
|
|
|
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, nullptr); |
|
|
|
|
json_key_string, token_lifetime, nullptr, 0); |
|
|
|
|
GPR_ASSERT(gpr_time_cmp(creds_as_jwt(jwt_creds)->jwt_lifetime(), |
|
|
|
|
grpc_max_auth_token_lifetime()) == 0); |
|
|
|
|
GPR_ASSERT(strncmp(expected_creds_debug_string_prefix, |
|
|
|
@ -1374,7 +1387,7 @@ static void test_jwt_creds_success(void) { |
|
|
|
|
expected_md emd[] = {{"authorization", expected_md_value.c_str()}}; |
|
|
|
|
grpc_call_credentials* creds = |
|
|
|
|
grpc_service_account_jwt_access_credentials_create( |
|
|
|
|
json_key_string, grpc_max_auth_token_lifetime(), nullptr); |
|
|
|
|
json_key_string, grpc_max_auth_token_lifetime(), nullptr, 0); |
|
|
|
|
|
|
|
|
|
/* First request: jwt_encode_and_sign should be called. */ |
|
|
|
|
request_metadata_state* state = |
|
|
|
@ -1408,6 +1421,99 @@ static void test_jwt_creds_success(void) { |
|
|
|
|
grpc_jwt_encode_and_sign_set_override(nullptr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void test_jwt_creds_with_scope_success(void) { |
|
|
|
|
const char expected_creds_debug_string_prefix[] = |
|
|
|
|
"JWTAccessCredentials{ExpirationTime:"; |
|
|
|
|
|
|
|
|
|
char* json_key_string = test_json_key_str(); |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, |
|
|
|
|
nullptr, nullptr}; |
|
|
|
|
std::string expected_md_value = absl::StrCat("Bearer ", test_signed_jwt3); |
|
|
|
|
expected_md emd[] = {{"authorization", expected_md_value.c_str()}}; |
|
|
|
|
grpc_call_credentials* creds = |
|
|
|
|
grpc_service_account_jwt_access_credentials_create( |
|
|
|
|
json_key_string, grpc_max_auth_token_lifetime(), test_scope, |
|
|
|
|
0 /* should_clear_audience*/); |
|
|
|
|
|
|
|
|
|
/* First request: jwt_encode_and_sign should be called. */ |
|
|
|
|
request_metadata_state* state = |
|
|
|
|
make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); |
|
|
|
|
grpc_jwt_encode_and_sign_set_override(encode_and_sign_jwt_with_scope_success); |
|
|
|
|
run_request_metadata_test(creds, auth_md_ctx, state); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
|
|
|
|
|
/* Second request: the cached token should be served directly. */ |
|
|
|
|
state = |
|
|
|
|
make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); |
|
|
|
|
grpc_jwt_encode_and_sign_set_override( |
|
|
|
|
encode_and_sign_jwt_should_not_be_called); |
|
|
|
|
run_request_metadata_test(creds, auth_md_ctx, state); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
|
|
|
|
|
/* Third request: Different service url so jwt_encode_and_sign should be
|
|
|
|
|
called again (no caching). */ |
|
|
|
|
state = |
|
|
|
|
make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); |
|
|
|
|
auth_md_ctx.service_url = other_test_service_url; |
|
|
|
|
grpc_jwt_encode_and_sign_set_override(encode_and_sign_jwt_with_scope_success); |
|
|
|
|
run_request_metadata_test(creds, auth_md_ctx, state); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
GPR_ASSERT(strncmp(expected_creds_debug_string_prefix, |
|
|
|
|
creds->debug_string().c_str(), |
|
|
|
|
strlen(expected_creds_debug_string_prefix)) == 0); |
|
|
|
|
creds->Unref(); |
|
|
|
|
gpr_free(json_key_string); |
|
|
|
|
grpc_jwt_encode_and_sign_set_override(nullptr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void test_jwt_creds_no_audience_success(void) { |
|
|
|
|
const char expected_creds_debug_string_prefix[] = |
|
|
|
|
"JWTAccessCredentials{ExpirationTime:"; |
|
|
|
|
|
|
|
|
|
char* json_key_string = test_json_key_str(); |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, |
|
|
|
|
nullptr, nullptr}; |
|
|
|
|
std::string expected_md_value = absl::StrCat("Bearer ", test_signed_jwt3); |
|
|
|
|
expected_md emd[] = {{"authorization", expected_md_value.c_str()}}; |
|
|
|
|
grpc_call_credentials* creds = |
|
|
|
|
grpc_service_account_jwt_access_credentials_create( |
|
|
|
|
json_key_string, grpc_max_auth_token_lifetime(), test_scope, |
|
|
|
|
1 /* should_clear_audience*/); |
|
|
|
|
|
|
|
|
|
/* First request: jwt_encode_and_sign should be called. */ |
|
|
|
|
request_metadata_state* state = |
|
|
|
|
make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); |
|
|
|
|
grpc_jwt_encode_and_sign_set_override(encode_and_sign_jwt_with_scope_success); |
|
|
|
|
run_request_metadata_test(creds, auth_md_ctx, state); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
|
|
|
|
|
/* Second request: the cached token should be served directly. */ |
|
|
|
|
state = |
|
|
|
|
make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); |
|
|
|
|
grpc_jwt_encode_and_sign_set_override( |
|
|
|
|
encode_and_sign_jwt_should_not_be_called); |
|
|
|
|
run_request_metadata_test(creds, auth_md_ctx, state); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
|
|
|
|
|
/* Third request: Different service url, but we still serve
|
|
|
|
|
the cached token because we only use scope and ignore audience. */ |
|
|
|
|
state = |
|
|
|
|
make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); |
|
|
|
|
auth_md_ctx.service_url = other_test_service_url; |
|
|
|
|
grpc_jwt_encode_and_sign_set_override( |
|
|
|
|
encode_and_sign_jwt_should_not_be_called); |
|
|
|
|
run_request_metadata_test(creds, auth_md_ctx, state); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
GPR_ASSERT(strncmp(expected_creds_debug_string_prefix, |
|
|
|
|
creds->debug_string().c_str(), |
|
|
|
|
strlen(expected_creds_debug_string_prefix)) == 0); |
|
|
|
|
creds->Unref(); |
|
|
|
|
gpr_free(json_key_string); |
|
|
|
|
grpc_jwt_encode_and_sign_set_override(nullptr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void test_jwt_creds_signing_failure(void) { |
|
|
|
|
const char expected_creds_debug_string_prefix[] = |
|
|
|
|
"JWTAccessCredentials{ExpirationTime:"; |
|
|
|
@ -1420,7 +1526,7 @@ static void test_jwt_creds_signing_failure(void) { |
|
|
|
|
0); |
|
|
|
|
grpc_call_credentials* creds = |
|
|
|
|
grpc_service_account_jwt_access_credentials_create( |
|
|
|
|
json_key_string, grpc_max_auth_token_lifetime(), nullptr); |
|
|
|
|
json_key_string, grpc_max_auth_token_lifetime(), nullptr, 0); |
|
|
|
|
|
|
|
|
|
grpc_jwt_encode_and_sign_set_override(encode_and_sign_jwt_failure); |
|
|
|
|
run_request_metadata_test(creds, auth_md_ctx, state); |
|
|
|
@ -1464,7 +1570,7 @@ static void test_google_default_creds_auth_key(void) { |
|
|
|
|
"json_key_google_default_creds", json_key); |
|
|
|
|
gpr_free(json_key); |
|
|
|
|
creds = reinterpret_cast<grpc_composite_channel_credentials*>( |
|
|
|
|
grpc_google_default_credentials_create(nullptr)); |
|
|
|
|
grpc_google_default_credentials_create(nullptr, nullptr)); |
|
|
|
|
auto* default_creds = |
|
|
|
|
reinterpret_cast<const grpc_google_default_channel_credentials*>( |
|
|
|
|
creds->inner_creds()); |
|
|
|
@ -1481,6 +1587,47 @@ static void test_google_default_creds_auth_key(void) { |
|
|
|
|
gpr_setenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR, ""); /* Reset. */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void test_google_default_creds_user_provided_scope(void) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_composite_channel_credentials* creds; |
|
|
|
|
char* json_key = test_json_key_str(); |
|
|
|
|
grpc_flush_cached_google_default_credentials(); |
|
|
|
|
set_gce_tenancy_checker_for_testing(test_gce_tenancy_checker); |
|
|
|
|
g_test_gce_tenancy_checker_called = false; |
|
|
|
|
g_test_is_on_gce = true; |
|
|
|
|
set_google_default_creds_env_var_with_file_contents( |
|
|
|
|
"json_key_google_default_creds", json_key); |
|
|
|
|
gpr_free(json_key); |
|
|
|
|
creds = reinterpret_cast<grpc_composite_channel_credentials*>( |
|
|
|
|
grpc_google_default_credentials_create(nullptr, test_scope)); |
|
|
|
|
auto* default_creds = |
|
|
|
|
reinterpret_cast<const grpc_google_default_channel_credentials*>( |
|
|
|
|
creds->inner_creds()); |
|
|
|
|
GPR_ASSERT(default_creds->ssl_creds() != nullptr); |
|
|
|
|
grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, |
|
|
|
|
nullptr, nullptr}; |
|
|
|
|
std::string expected_md_value = absl::StrCat("Bearer ", test_signed_jwt3); |
|
|
|
|
expected_md emd[] = {{"authorization", expected_md_value.c_str()}}; |
|
|
|
|
request_metadata_state* state = |
|
|
|
|
make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); |
|
|
|
|
grpc_jwt_encode_and_sign_set_override(encode_and_sign_jwt_with_scope_success); |
|
|
|
|
run_request_metadata_test( |
|
|
|
|
const_cast<grpc_call_credentials*>(creds->call_creds()), auth_md_ctx, |
|
|
|
|
state); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
auto* jwt = |
|
|
|
|
reinterpret_cast<const grpc_service_account_jwt_access_credentials*>( |
|
|
|
|
creds->call_creds()); |
|
|
|
|
GPR_ASSERT( |
|
|
|
|
strcmp(jwt->key().client_id, |
|
|
|
|
"777-abaslkan11hlb6nmim3bpspl31ud.apps.googleusercontent.com") == |
|
|
|
|
0); |
|
|
|
|
|
|
|
|
|
GPR_ASSERT(g_test_gce_tenancy_checker_called == false); |
|
|
|
|
creds->Unref(); |
|
|
|
|
gpr_setenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR, ""); /* Reset. */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void test_google_default_creds_refresh_token(void) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_composite_channel_credentials* creds; |
|
|
|
@ -1488,7 +1635,7 @@ static void test_google_default_creds_refresh_token(void) { |
|
|
|
|
set_google_default_creds_env_var_with_file_contents( |
|
|
|
|
"refresh_token_google_default_creds", test_refresh_token_str); |
|
|
|
|
creds = reinterpret_cast<grpc_composite_channel_credentials*>( |
|
|
|
|
grpc_google_default_credentials_create(nullptr)); |
|
|
|
|
grpc_google_default_credentials_create(nullptr, nullptr)); |
|
|
|
|
auto* default_creds = |
|
|
|
|
reinterpret_cast<const grpc_google_default_channel_credentials*>( |
|
|
|
|
creds->inner_creds()); |
|
|
|
@ -1539,7 +1686,7 @@ static void test_google_default_creds_gce(void) { |
|
|
|
|
/* Simulate a successful detection of GCE. */ |
|
|
|
|
grpc_composite_channel_credentials* creds = |
|
|
|
|
reinterpret_cast<grpc_composite_channel_credentials*>( |
|
|
|
|
grpc_google_default_credentials_create(nullptr)); |
|
|
|
|
grpc_google_default_credentials_create(nullptr, nullptr)); |
|
|
|
|
|
|
|
|
|
/* Verify that the default creds actually embeds a GCE creds. */ |
|
|
|
|
GPR_ASSERT(creds != nullptr); |
|
|
|
@ -1578,7 +1725,7 @@ static void test_google_default_creds_non_gce(void) { |
|
|
|
|
httpcli_post_should_not_be_called); |
|
|
|
|
grpc_composite_channel_credentials* creds = |
|
|
|
|
reinterpret_cast<grpc_composite_channel_credentials*>( |
|
|
|
|
grpc_google_default_credentials_create(nullptr)); |
|
|
|
|
grpc_google_default_credentials_create(nullptr, nullptr)); |
|
|
|
|
/* Verify that the default creds actually embeds a GCE creds. */ |
|
|
|
|
GPR_ASSERT(creds != nullptr); |
|
|
|
|
GPR_ASSERT(creds->call_creds() != nullptr); |
|
|
|
@ -1616,10 +1763,12 @@ static void test_no_google_default_creds(void) { |
|
|
|
|
default_creds_gce_detection_httpcli_get_failure_override, |
|
|
|
|
httpcli_post_should_not_be_called); |
|
|
|
|
/* Simulate a successful detection of GCE. */ |
|
|
|
|
GPR_ASSERT(grpc_google_default_credentials_create(nullptr) == nullptr); |
|
|
|
|
GPR_ASSERT(grpc_google_default_credentials_create(nullptr, nullptr) == |
|
|
|
|
nullptr); |
|
|
|
|
/* Try a second one. GCE detection should occur again. */ |
|
|
|
|
g_test_gce_tenancy_checker_called = false; |
|
|
|
|
GPR_ASSERT(grpc_google_default_credentials_create(nullptr) == nullptr); |
|
|
|
|
GPR_ASSERT(grpc_google_default_credentials_create(nullptr, nullptr) == |
|
|
|
|
nullptr); |
|
|
|
|
GPR_ASSERT(g_test_gce_tenancy_checker_called == true); |
|
|
|
|
/* Cleanup. */ |
|
|
|
|
grpc_override_well_known_credentials_path_getter(nullptr); |
|
|
|
@ -1645,7 +1794,7 @@ static void test_google_default_creds_call_creds_specified(void) { |
|
|
|
|
httpcli_post_should_not_be_called); |
|
|
|
|
grpc_composite_channel_credentials* channel_creds = |
|
|
|
|
reinterpret_cast<grpc_composite_channel_credentials*>( |
|
|
|
|
grpc_google_default_credentials_create(call_creds)); |
|
|
|
|
grpc_google_default_credentials_create(call_creds, nullptr)); |
|
|
|
|
GPR_ASSERT(g_test_gce_tenancy_checker_called == false); |
|
|
|
|
GPR_ASSERT(channel_creds != nullptr); |
|
|
|
|
GPR_ASSERT(channel_creds->call_creds() != nullptr); |
|
|
|
@ -1704,7 +1853,8 @@ static void test_google_default_creds_not_default(void) { |
|
|
|
|
httpcli_post_should_not_be_called); |
|
|
|
|
grpc_composite_channel_credentials* channel_creds = |
|
|
|
|
reinterpret_cast<grpc_composite_channel_credentials*>( |
|
|
|
|
grpc_google_default_credentials_create(call_creds.release())); |
|
|
|
|
grpc_google_default_credentials_create(call_creds.release(), |
|
|
|
|
nullptr)); |
|
|
|
|
GPR_ASSERT(g_test_gce_tenancy_checker_called == false); |
|
|
|
|
GPR_ASSERT(channel_creds != nullptr); |
|
|
|
|
GPR_ASSERT(channel_creds->call_creds() != nullptr); |
|
|
|
@ -3390,6 +3540,8 @@ int main(int argc, char** argv) { |
|
|
|
|
test_sts_creds_token_file_not_found(); |
|
|
|
|
test_jwt_creds_lifetime(); |
|
|
|
|
test_jwt_creds_success(); |
|
|
|
|
test_jwt_creds_with_scope_success(); |
|
|
|
|
test_jwt_creds_no_audience_success(); |
|
|
|
|
test_jwt_creds_signing_failure(); |
|
|
|
|
test_google_default_creds_auth_key(); |
|
|
|
|
test_google_default_creds_refresh_token(); |
|
|
|
@ -3398,6 +3550,7 @@ int main(int argc, char** argv) { |
|
|
|
|
test_no_google_default_creds(); |
|
|
|
|
test_google_default_creds_call_creds_specified(); |
|
|
|
|
test_google_default_creds_not_default(); |
|
|
|
|
test_google_default_creds_user_provided_scope(); |
|
|
|
|
test_metadata_plugin_success(); |
|
|
|
|
test_metadata_plugin_failure(); |
|
|
|
|
test_get_well_known_google_credentials_file_path(); |
|
|
|
|