Skip to content

Commit 961f656

Browse files
committed
make ALB base URL configurable; add unit test
Signed-off-by: Hans Zandbelt <hans.zandbelt@openidc.com>
1 parent 4505696 commit 961f656

File tree

4 files changed

+73
-12
lines changed

4 files changed

+73
-12
lines changed

AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ reporting bugs, providing fixes, suggesting useful features or other:
1515
Pavel Anpin <https://github.com/anpin>
1616
smanolache <https://github.com/smanolache>
1717
pladen <https://github.com/pladen>
18+
Drew <https://github.com/drwxmrrs>

src/jose.c

+24-11
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,7 @@ _oauth2_jose_jwks_provider_init(oauth2_log_t *log,
742742
case OAUTH2_JOSE_JWKS_PROVIDER_AWS_ALB:
743743
provider->resolve = oauth2_jose_jwks_aws_alb_resolve;
744744
provider->alb_arn = NULL;
745+
provider->alb_base_url = NULL;
745746
break;
746747
}
747748

@@ -773,6 +774,7 @@ _oauth2_jose_jwks_provider_clone(oauth2_log_t *log,
773774
break;
774775
case OAUTH2_JOSE_JWKS_PROVIDER_AWS_ALB:
775776
dst->alb_arn = oauth2_strdup(src->alb_arn);
777+
dst->alb_base_url = oauth2_strdup(src->alb_base_url);
776778
break;
777779
}
778780

@@ -802,6 +804,8 @@ _oauth2_jose_jwks_provider_free(oauth2_log_t *log,
802804
case OAUTH2_JOSE_JWKS_PROVIDER_AWS_ALB:
803805
if (provider->alb_arn)
804806
oauth2_mem_free(provider->alb_arn);
807+
if (provider->alb_base_url)
808+
oauth2_mem_free(provider->alb_base_url);
805809
break;
806810
}
807811

@@ -1864,6 +1868,7 @@ _OAUTH_CFG_CTX_CALLBACK(oauth2_jose_verify_options_jwk_set_aws_alb)
18641868
oauth2_cfg_token_verify_t *verify = (oauth2_cfg_token_verify_t *)ctx;
18651869
char *rv = NULL;
18661870
oauth2_jose_jwt_verify_ctx_t *ptr = NULL;
1871+
const char *alb_base_url = NULL;
18671872

18681873
oauth2_debug(log, "enter");
18691874

@@ -1880,6 +1885,11 @@ _OAUTH_CFG_CTX_CALLBACK(oauth2_jose_verify_options_jwk_set_aws_alb)
18801885

18811886
ptr->jwks_provider->alb_arn = oauth2_strdup(value);
18821887

1888+
alb_base_url = oauth2_nv_list_get(log, params, "alb_base_url");
1889+
if (alb_base_url) {
1890+
ptr->jwks_provider->alb_base_url = oauth2_strdup(alb_base_url);
1891+
}
1892+
18831893
end:
18841894

18851895
oauth2_debug(log, "leave: %s", rv);
@@ -2266,6 +2276,8 @@ oauth2_jose_jwks_aws_alb_resolve(oauth2_log_t *log,
22662276
bool *refresh, cjose_header_t *hdr)
22672277
{
22682278
cjose_err err;
2279+
char *url = NULL;
2280+
const char *region = NULL;
22692281

22702282
const char *signer = cjose_header_get(hdr, "signer", &err);
22712283
const char *kid = cjose_header_get(hdr, "kid", &err);
@@ -2278,7 +2290,6 @@ oauth2_jose_jwks_aws_alb_resolve(oauth2_log_t *log,
22782290
return NULL;
22792291
}
22802292

2281-
// TODO - maybe needed? timing safe compare?
22822293
if (strcmp(signer, provider->alb_arn) != 0) {
22832294
oauth2_error(
22842295
log,
@@ -2287,17 +2298,19 @@ oauth2_jose_jwks_aws_alb_resolve(oauth2_log_t *log,
22872298
return NULL;
22882299
}
22892300

2290-
const char *region =
2291-
_oauth2_jose_jwks_aws_alb_region(provider->alb_arn);
2292-
if (!region) {
2293-
oauth2_error(log, "failed to extract region from ARN: arn=%s",
2294-
provider->alb_arn);
2295-
return NULL;
2301+
if (provider->alb_base_url == NULL) {
2302+
region = _oauth2_jose_jwks_aws_alb_region(provider->alb_arn);
2303+
if (!region) {
2304+
oauth2_error(
2305+
log, "failed to extract region from ARN: arn=%s",
2306+
provider->alb_arn);
2307+
return NULL;
2308+
}
2309+
url = _oauth2_stradd4(NULL, "https://public-keys.auth.elb.",
2310+
region, ".amazonaws.com/", kid);
2311+
} else {
2312+
url = oauth2_stradd(NULL, provider->alb_base_url, kid, NULL);
22962313
}
2297-
2298-
// TODO: make the base URL configurable
2299-
char *url = _oauth2_stradd4(NULL, "https://public-keys.auth.elb.",
2300-
region, ".amazonaws.com/", kid);
23012314
oauth2_debug(log, "constructed ALB JWKs URL: %s", url);
23022315

23032316
provider->jwks_uri = oauth2_uri_ctx_init(log);

src/jose_int.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ typedef struct oauth2_jose_jwks_provider_t {
6363
union {
6464
oauth2_uri_ctx_t *jwks_uri;
6565
oauth2_jose_jwk_list_t *jwks;
66-
char *alb_arn;
66+
struct {
67+
char *alb_arn;
68+
char *alb_base_url;
69+
};
6770
};
6871
// struct oauth2_jose_jwks_provider_t *next;
6972
} oauth2_jose_jwks_provider_t;

test/check_oauth2.c

+44
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,49 @@ START_TEST(test_oauth2_verify_eckey_uri)
789789
}
790790
END_TEST
791791

792+
START_TEST(test_oauth2_verify_aws_alb)
793+
{
794+
bool rc = false;
795+
oauth2_cfg_token_verify_t *verify = NULL;
796+
char *jwt =
797+
"eyJ0eXAiOiJKV1QiLCJraWQiOiIwOWQ0ZmExNy0yMjNlLTQwZmEtYjI4MC04OTRlOD"
798+
"QzZDcwMWYiLCJhbGciOiJFUzI1NiIsImlzcyI6Imh0dHBzOi8vYWNjb3VudHMuZ29v"
799+
"Z2xlLmNvbSIsImNsaWVudCI6IjY4NjMwMzIzMzEzMS1wZjA4b3J2YzVyY3BmaXQwdm"
800+
"xxNW82dWg0N3UyZW5mZy5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInNpZ25l"
801+
"ciI6ImFybjphd3M6ZWxhc3RpY2xvYWRiYWxhbmNpbmc6ZXUtY2VudHJhbC0xOjAwNj"
802+
"E3NTk0MDQ5NDpsb2FkYmFsYW5jZXIvYXBwL2JhbGFuY2VyMS8xODE3NThhZTJiMGMz"
803+
"ZWRlIiwiZXhwIjoxNTQyMDQ1Mzk5fQ==."
804+
"ewogICJzdWIiOiAiMTA5NzE2NDkyNjgxNjg2MTcyOTY5IiwKICAibmFtZSI6ICJIYW"
805+
"5zIFphbmRiZWx0IiwKICAiZ2l2ZW5fbmFtZSI6ICJIYW5zIiwKICAiZmFtaWx5X25h"
806+
"bWUiOiAiWmFuZGJlbHQiLAogICJwcm9maWxlIjogImh0dHBzOi8vcGx1cy5nb29nbG"
807+
"UuY29tLzEwOTcxNjQ5MjY4MTY4NjE3Mjk2OSIsCiAgInBpY3R1cmUiOiAiaHR0cHM6"
808+
"Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tLy1pOUc3U1V2S1FETS9BQUFBQUFBQU"
809+
"FBSS9BQUFBQUFBQUFBQS9zeEFzTk5FVlJWZy9waG90by5qcGciCn0=."
810+
"AlH8PGya9avWoGVkWOFWbMNiLdpSDQZqP-"
811+
"OuGfIXHw1CZWjxfJInXYiRsKRZlvlXJA5fguaeNKZ1Q_RyDjNqRg==";
812+
json_t *json_payload = NULL;
813+
const char *rv = NULL;
814+
char *url = NULL, *options = NULL;
815+
816+
url = oauth2_stradd(NULL, oauth2_check_http_base_url(),
817+
get_eckey_url_path, NULL);
818+
options = oauth2_stradd(NULL, "alb_base_url", "=", url);
819+
rv = oauth2_cfg_token_verify_add_options(
820+
_log, &verify, "aws_alb",
821+
"arn:aws:elasticloadbalancing:eu-central-1:006175940494:"
822+
"loadbalancer/app/balancer1/181758ae2b0c3ede",
823+
options);
824+
ck_assert_ptr_eq(rv, NULL);
825+
826+
rc = oauth2_token_verify(_log, NULL, verify, jwt, &json_payload);
827+
ck_assert_int_eq(rc, true);
828+
829+
oauth2_cfg_token_verify_free(_log, verify);
830+
oauth2_mem_free(url);
831+
json_decref(json_payload);
832+
}
833+
END_TEST
834+
792835
START_TEST(test_oauth2_verify_token_introspection)
793836
{
794837
bool rc = false;
@@ -1166,6 +1209,7 @@ Suite *oauth2_check_oauth2_suite()
11661209
tcase_add_test(c, test_oauth2_verify_jwk);
11671210
tcase_add_test(c, test_oauth2_verify_jwk_dpop);
11681211
tcase_add_test(c, test_oauth2_verify_eckey_uri);
1212+
tcase_add_test(c, test_oauth2_verify_aws_alb);
11691213
tcase_add_test(c, test_oauth2_verify_token_introspection);
11701214
tcase_add_test(c, test_oauth2_verify_token_plain);
11711215
tcase_add_test(c, test_oauth2_verify_token_base64);

0 commit comments

Comments
 (0)