diff options
Diffstat (limited to 'apps/styx_web')
-rw-r--r-- | apps/styx_web/src/styx_web_app.erl | 1 | ||||
-rw-r--r-- | apps/styx_web/src/styx_web_userinfo.erl | 35 |
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. |