Просмотр исходного кода

fix(authn/http): log meaningful error message if http header is missing

zmstone 1 год назад
Родитель
Сommit
2acde5a4e4

+ 5 - 1
apps/emqx_auth/src/emqx_auth_utils.erl

@@ -301,7 +301,11 @@ serialize_body(<<"application/json">>, BodyTemplate, ClientInfo) ->
     emqx_utils_json:encode(Body);
 serialize_body(<<"application/x-www-form-urlencoded">>, BodyTemplate, ClientInfo) ->
     Body = emqx_auth_utils:render_deep_for_url(BodyTemplate, ClientInfo),
-    uri_string:compose_query(maps:to_list(Body)).
+    uri_string:compose_query(maps:to_list(Body));
+serialize_body(undefined, _BodyTemplate, _ClientInfo) ->
+    throw(missing_content_type_header);
+serialize_body(ContentType, _BodyTemplate, _ClientInfo) ->
+    throw({unknown_content_type_header_value, ContentType}).
 
 -ifdef(TEST).
 -include_lib("eunit/include/eunit.hrl").

+ 18 - 6
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", #{