mirror of
https://github.com/tinode/chat.git
synced 2025-03-14 10:05:07 +00:00
Implement token authentication in loadtest.
This commit is contained in:
Binary file not shown.
@ -5,7 +5,7 @@
|
||||
%% directory.
|
||||
|
||||
-module(tinode).
|
||||
-export([rand_user_secret/1, shuffle/1]).
|
||||
-export([rand_user_secret/1, shuffle/1, cache_token/2, read_token/1]).
|
||||
|
||||
%% Produces a secret for use in basic login.
|
||||
rand_user_secret({Pid, DynData}) ->
|
||||
@ -27,3 +27,19 @@ get_rand_secret() ->
|
||||
shuffle(L) ->
|
||||
RandomList=[{rand:uniform(), X} || X <- L],
|
||||
[X || {_,X} <- lists:sort(RandomList)].
|
||||
|
||||
%% Reads previously cached token for the specified user.
|
||||
read_token(Uid) ->
|
||||
{ok, LogDir} = application:get_env(tsung_controller, log_dir_real),
|
||||
case file:read_file(filename:join(LogDir, Uid)) of
|
||||
{ok, Data} -> string:trim(Data);
|
||||
{error, _} -> ""
|
||||
end.
|
||||
|
||||
%% Saves auth token for the specified user in the log directory.
|
||||
cache_token(Uid, Token) ->
|
||||
{ok, LogDir} = application:get_env(tsung_controller, log_dir_real),
|
||||
{ok, File} = file:open(filename:join(LogDir, Uid), [write]),
|
||||
file:write(File, Token),
|
||||
file:close(File),
|
||||
ok.
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
<load>
|
||||
<arrivalphase phase="1" duration="120" unit="second">
|
||||
<users maxnumber="100" arrivalrate="1" unit="second" />
|
||||
<users maxnumber="1500" arrivalrate="10" unit="second" />
|
||||
</arrivalphase>
|
||||
</load>
|
||||
|
||||
@ -31,9 +31,49 @@
|
||||
<websocket type="message">{"hi":{"id":"%%_baseid%%01","ver":"0.15","ua":"Tsung-Loadtest/1.0; tsung/1.7.0"}}</websocket>
|
||||
</request>
|
||||
|
||||
<request subst="true">
|
||||
<websocket type="message">{"login":{"id":"%%_baseid%%02","scheme":"basic","secret":"%%tinode:rand_user_secret%%"}}</websocket>
|
||||
</request>
|
||||
<!-- Randomly pick a user. -->
|
||||
<setdynvars sourcetype="eval"
|
||||
code='fun({Pid, DynVars}) ->
|
||||
tinode:rand_user_secret({Pid, DynVars})
|
||||
end.'>
|
||||
<var name="secret" />
|
||||
</setdynvars>
|
||||
|
||||
<!-- Read auth token from the cache. -->
|
||||
<setdynvars sourcetype="eval"
|
||||
code='fun({Pid, DynVars}) ->
|
||||
{ok, Secret} = ts_dynvars:lookup(secret, DynVars),
|
||||
tinode:read_token(Secret)
|
||||
end.'>
|
||||
<var name="token" />
|
||||
</setdynvars>
|
||||
|
||||
<!-- Token present. Authenticate with it. -->
|
||||
<if var="token" neq="">
|
||||
<request subst="true">
|
||||
<match do="abort" when="nomatch">{"ctrl":.*"code":200.*}</match>
|
||||
<websocket type="message">{"login":{"id":"%%_baseid%%02","scheme":"token","secret":"%%_token%%"}}</websocket>
|
||||
</request>
|
||||
</if>
|
||||
|
||||
<!-- else log in with user name and password. -->
|
||||
<if var="token" eq="">
|
||||
<request subst="true">
|
||||
<match do="abort" when="nomatch">{"ctrl":.*"code":200.*}</match>
|
||||
<dyn_variable name="token" re='^{"ctrl":.*"token":"([-A-Za-z0-9+\/=]+={0,3})".*}$'/>
|
||||
<websocket type="message">{"login":{"id":"%%_baseid%%02","scheme":"basic","secret":"%%_secret%%"}}</websocket>
|
||||
</request>
|
||||
|
||||
<!-- Save token in the cache. -->
|
||||
<setdynvars sourcetype="eval"
|
||||
code='fun({_, DynVars}) ->
|
||||
{ok, Token} = ts_dynvars:lookup(token, DynVars),
|
||||
{ok, Secret} = ts_dynvars:lookup(secret, DynVars),
|
||||
tinode:cache_token(Secret, Token)
|
||||
end.'>
|
||||
<var name="dummy" />
|
||||
</setdynvars>
|
||||
</if>
|
||||
|
||||
<request subst="true">
|
||||
<websocket type="message" frame="text">{"sub":{"id":"%%_baseid%%03","topic":"me","get":{"what":"desc"}}}</websocket>
|
||||
|
Reference in New Issue
Block a user