From 93232d425371b5d0ee51af34138fcc37ede2eff8 Mon Sep 17 00:00:00 2001 From: zmstone Date: Tue, 14 May 2024 10:22:07 +0200 Subject: [PATCH] fix(authn/http): log meaningful error message if http header is missing --- .../src/emqx_authn/emqx_authn_chains.erl | 24 ++++++++++++++----- apps/emqx_auth_http/src/emqx_authn_http.erl | 4 +++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/apps/emqx_auth/src/emqx_authn/emqx_authn_chains.erl b/apps/emqx_auth/src/emqx_authn/emqx_authn_chains.erl index 946ef9ff3..27fc19ca7 100644 --- a/apps/emqx_auth/src/emqx_authn/emqx_authn_chains.erl +++ b/apps/emqx_auth/src/emqx_authn/emqx_authn_chains.erl @@ -678,16 +678,28 @@ do_authenticate( {stop, Result} catch Class:Reason:Stacktrace -> - ?TRACE_AUTHN(warning, "authenticator_error", #{ - exception => Class, - reason => Reason, - stacktrace => Stacktrace, - authenticator => ID - }), + ?TRACE_AUTHN( + warning, + "authenticator_error", + maybe_add_stacktrace( + Class, + #{ + exception => Class, + reason => Reason, + authenticator => ID + }, + Stacktrace + ) + ), emqx_metrics_worker:inc(authn_metrics, MetricsID, nomatch), do_authenticate(ChainName, More, Credential) end. +maybe_add_stacktrace('throw', Data, _Stacktrace) -> + Data; +maybe_add_stacktrace(_, Data, Stacktrace) -> + Data#{stacktrace => Stacktrace}. + authenticate_with_provider(#authenticator{id = ID, provider = Provider, state = State}, Credential) -> AuthnResult = Provider:authenticate(Credential, State), ?TRACE_AUTHN("authenticator_result", #{ diff --git a/apps/emqx_auth_http/src/emqx_authn_http.erl b/apps/emqx_auth_http/src/emqx_authn_http.erl index 5cbffb394..96eb1215a 100644 --- a/apps/emqx_auth_http/src/emqx_authn_http.erl +++ b/apps/emqx_auth_http/src/emqx_authn_http.erl @@ -189,7 +189,9 @@ qs([{K, V} | More], Acc) -> serialize_body(<<"application/json">>, Body) -> emqx_utils_json:encode(Body); serialize_body(<<"application/x-www-form-urlencoded">>, Body) -> - qs(maps:to_list(Body)). + qs(maps:to_list(Body)); +serialize_body(undefined, _) -> + throw("missing_content_type_header"). handle_response(Headers, Body) -> ContentType = proplists:get_value(<<"content-type">>, Headers),