aboutsummaryrefslogtreecommitdiff
path: root/apps/styx_web
diff options
context:
space:
mode:
Diffstat (limited to 'apps/styx_web')
-rw-r--r--apps/styx_web/src/styx_web_app.erl1
-rw-r--r--apps/styx_web/src/styx_web_userinfo.erl35
2 files changed, 36 insertions, 0 deletions
diff --git a/apps/styx_web/src/styx_web_app.erl b/apps/styx_web/src/styx_web_app.erl
index 39ce39b..ce2f29f 100644
--- a/apps/styx_web/src/styx_web_app.erl
+++ b/apps/styx_web/src/styx_web_app.erl
@@ -29,6 +29,7 @@ routes() ->
%% App
{"/", styx_web_index, undefined},
{"/launchpad", styx_web_launchpad, undefined},
+ {"/userinfo", styx_web_userinfo, undefined},
%% Kratos
{"/login", styx_web_kratos_flow, #{page_title => "Login", template => login_dtl, getflowmf => {ory_kratos, login_flow}, initflowmf => {ory_kratos, login_url}}},
diff --git a/apps/styx_web/src/styx_web_userinfo.erl b/apps/styx_web/src/styx_web_userinfo.erl
new file mode 100644
index 0000000..2875898
--- /dev/null
+++ b/apps/styx_web/src/styx_web_userinfo.erl
@@ -0,0 +1,35 @@
+-module(styx_web_userinfo).
+-behaviour(cowboy_handler).
+-export([init/2]).
+
+init(Req = #{method := <<"GET">>}, State) ->
+ get(Req, State);
+init(Req, _) ->
+ styx_web_error:init(Req, #{code => 404, status => <<"Not Found">>}).
+
+get(Req, State) ->
+ Authorization = cowboy_req:header(<<"authorization">>, Req),
+ case ory_hydra:userinfo(Authorization) of
+ {ok, UserInfo} ->
+ get_identity(Req, UserInfo, State)
+ end.
+
+get_identity(Req, UserInfo = #{<<"sub">> := Id}, State) ->
+ case ory_kratos:get_identity(Id) of
+ {ok, Identity} -> process(Req, UserInfo, Identity, State)
+ end.
+
+process(Req, UserInfo, #{<<"traits">> := Traits, <<"schema_id">> := Schema}, State) ->
+ Mapper = maps:get(Schema, application:get_env(styx, openid_userinfo_mapper, #{})),
+ MapFun = fun(Key, Value, Acc) -> maps:put(Key, get_value(Traits, Value), Acc) end,
+ Data = maps:fold(MapFun, #{}, Mapper),
+ MergedData = maps:merge(UserInfo, Data),
+ Headers = #{<<"content-type">> => <<"application/json">>},
+ cowboy_req:reply(200, Headers, jsone:encode(MergedData), Req).
+
+get_value(Traits, Value) when is_binary(Value) ->
+ maps:get(Value, Traits);
+get_value(Traits, [Value | Acc]) ->
+ get_value(maps:get(Value, Traits), Acc);
+get_value(Value, []) ->
+ Value.