This commit is contained in:
anlicheng 2026-04-24 16:29:32 +08:00
parent 2ff3f3b2c1
commit 64873bdf54
2 changed files with 15 additions and 11 deletions

View File

@ -13,9 +13,8 @@
-export([check/5]). -export([check/5]).
%% token是否是合法值 %% token是否是合法值
-spec check(Username :: binary(), Token :: binary(), UUID :: binary(), Salt :: binary(), Timestamp :: integer()) -> boolean(). -spec check(Username :: binary(), Token :: binary(), UUID :: binary(), Salt :: binary(), Timestamp :: integer()) ->
check(Username, Token, UUID, Salt, Timestamp) when is_binary(Username), is_binary(Token), is_binary(UUID), is_binary(Salt), is_integer(Timestamp) -> ok | {error, Reason :: binary()}.
true;
check(Username, Token, UUID, Salt, Timestamp) when is_binary(Username), is_binary(Token), is_binary(UUID), is_binary(Salt), is_integer(Timestamp) -> check(Username, Token, UUID, Salt, Timestamp) when is_binary(Username), is_binary(Token), is_binary(UUID), is_binary(Salt), is_integer(Timestamp) ->
BinTimestamp = integer_to_binary(Timestamp), BinTimestamp = integer_to_binary(Timestamp),
%% 1 %% 1
@ -24,10 +23,15 @@ check(Username, Token, UUID, Salt, Timestamp) when is_binary(Username), is_binar
{ok, PreTokens} = application:get_env(iot, pre_tokens), {ok, PreTokens} = application:get_env(iot, pre_tokens),
case proplists:get_value(Username, PreTokens) of case proplists:get_value(Username, PreTokens) of
undefined -> undefined ->
false; {error, <<"illegal user">>};
PreToken when is_binary(PreToken) -> PreToken when is_binary(PreToken) ->
iot_util:md5(<<Salt/binary, "!", PreToken/binary, "!", UUID/binary, "!", BinTimestamp/binary>>) =:= Token case iot_util:md5(<<Salt/binary, "!", PreToken/binary, "!", UUID/binary, "!", BinTimestamp/binary>>) =:= Token of
true ->
ok;
false ->
{error, <<"invalid token">>}
end
end; end;
false -> false ->
false {error, <<"invalid timestamp">>}
end. end.

View File

@ -224,7 +224,7 @@ handle_request_frame(#'RequestFrame'{packet_id = PacketId,
logger:debug("[ws_channel] auth uuid: ~p", [UUID]), logger:debug("[ws_channel] auth uuid: ~p", [UUID]),
case iot_auth:check(Username, Token, UUID, Salt, Timestamp) of case iot_auth:check(Username, Token, UUID, Salt, Timestamp) of
true -> ok ->
case iot_api_client:get_host_by_uuid(UUID) of case iot_api_client:get_host_by_uuid(UUID) of
undefined -> undefined ->
logger:warning("[ws_channel] uuid: ~p, user: ~p, host not found", [UUID, Username]), logger:warning("[ws_channel] uuid: ~p, user: ~p, host not found", [UUID, Username]),
@ -248,9 +248,9 @@ handle_request_frame(#'RequestFrame'{packet_id = PacketId,
{stop, State} {stop, State}
end end
end; end;
false -> {error, Reason} ->
send_reply_frame(Transport, Socket, PacketId, {error, #'ReplyFrame.Error'{code = 2, message = <<"auth failed">>}}), send_reply_frame(Transport, Socket, PacketId, {error, #'ReplyFrame.Error'{code = 2, message = Reason}}),
logger:warning("[ws_channel] uuid: ~p, user: ~p, auth failed", [UUID, Username]), logger:warning("[ws_channel] uuid: ~p, user: ~p, auth failed, reason: ~p", [UUID, Username, Reason]),
{stop, State} {stop, State}
end; end;
handle_request_frame(#'RequestFrame'{packet_id = PacketId, body = {container_request, ContainerRequest}}, _Transport, _Socket, State) -> handle_request_frame(#'RequestFrame'{packet_id = PacketId, body = {container_request, ContainerRequest}}, _Transport, _Socket, State) ->