aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2022-03-31 07:07:38 +0200
committerJordan Bracco <href@random.sh>2022-03-31 07:07:38 +0200
commitec73e94c592e069f6abd44b292d156184a82c3ed (patch)
treeaa56df47f9527f41b1f266d64e37faa8dfed4de2 /src
import from styxHEADmain
Diffstat (limited to 'src')
-rw-r--r--src/ory.app.src16
-rw-r--r--src/ory.erl3
-rw-r--r--src/ory_hydra.erl67
-rw-r--r--src/ory_kratos.erl103
4 files changed, 189 insertions, 0 deletions
diff --git a/src/ory.app.src b/src/ory.app.src
new file mode 100644
index 0000000..c4098ee
--- /dev/null
+++ b/src/ory.app.src
@@ -0,0 +1,16 @@
+{application, ory,
+ [{description, "Ory library"},
+ {vsn, "0.1.0"},
+ {registered, []},
+ {applications,
+ [kernel,
+ stdlib,
+ hackney,
+ jsone
+ ]},
+ {env,[]},
+ {modules, []},
+
+ {licenses, ["Apache 2.0"]},
+ {links, []}
+ ]}.
diff --git a/src/ory.erl b/src/ory.erl
new file mode 100644
index 0000000..5c06bc9
--- /dev/null
+++ b/src/ory.erl
@@ -0,0 +1,3 @@
+-module(ory).
+
+-export([]).
diff --git a/src/ory_hydra.erl b/src/ory_hydra.erl
new file mode 100644
index 0000000..d31cd82
--- /dev/null
+++ b/src/ory_hydra.erl
@@ -0,0 +1,67 @@
+-module(ory_hydra).
+-export([url/0, admin_url/0, userinfo/1, login_request/1, accept_login_request/2, consent_request/1, accept_consent_request/2, reject_consent_request/2]).
+
+login_request(Challenge) ->
+ Url = [admin_url(), "/oauth2/auth/requests/login?login_challenge=", Challenge],
+ Headers = [{"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+accept_login_request(Challenge, Data) ->
+ Url = [admin_url(), "/oauth2/auth/requests/login/accept?login_challenge=", Challenge],
+ Headers = [{"accept", "application/json"}, {"content_type", "application/json"}],
+ Json = jsone:encode(Data),
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(put, Url, Headers, Json, Opts)).
+
+consent_request(Challenge) ->
+ Url = [admin_url(), "/oauth2/auth/requests/consent?consent_challenge=", Challenge],
+ Headers = [{"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+accept_consent_request(Challenge, Data) ->
+ Url = [admin_url(), "/oauth2/auth/requests/consent/accept?consent_challenge=", Challenge],
+ Headers = [{"accept", "application/json"}, {"content_type", "application/json"}],
+ Json = jsone:encode(Data),
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(put, Url, Headers, Json, Opts)).
+
+reject_consent_request(Challenge, Data) ->
+ Url = [admin_url(), "/oauth2/auth/requests/consent/reject?consent_challenge=", Challenge],
+ Headers = [{"accept", "application/json"}, {"content_type", "application/json"}],
+ Json = jsone:encode(Data),
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(put, Url, Headers, Json, Opts)).
+
+userinfo(Authorization) ->
+ Url = [url(), "/userinfo"],
+ Headers = [{"accept", "application/json"}, {"authorization", Authorization}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+admin_url() ->
+ {ok, Value} = application:get_env(ory, hydra_admin_url),
+ Value.
+
+url() ->
+ {ok, Value} = application:get_env(ory, hydra_url),
+ Value.
+
+api_response(Error = {error, Error}) ->
+ logger:error("ory_kratos hackney error: ~p", [Error]),
+ {error, #{<<"code">> => 503, <<"status">> => "Not Available", <<"message">> => "This service isn't available at the moment."}};
+api_response({ok, 200, _, Client}) ->
+ {ok, Body} = hackney:body(Client),
+ {ok, jsone:decode(Body)};
+api_response({ok, _Code, _, Client}) ->
+ {ok, Body} = hackney:body(Client),
+ JSON = #{<<"error">> := Error} = jsone:decode(Body),
+ logger:debug("hydra error: ~p", [JSON]),
+ {error, Error}.
diff --git a/src/ory_kratos.erl b/src/ory_kratos.erl
new file mode 100644
index 0000000..162df05
--- /dev/null
+++ b/src/ory_kratos.erl
@@ -0,0 +1,103 @@
+-module(ory_kratos).
+
+-export([login_url/1, registration_url/1, settings_url/1, recovery_url/1, verification_url/1, url/0, admin_url/0]).
+-export([registration_flow/2, login_flow/2, settings_flow/2, recovery_flow/2, verification_flow/2, logout_flow/1, whoami/1, error/1]).
+-export([get_identity/1]).
+
+login_url(browser) ->
+ [url(), "/self-service/login/browser"].
+
+registration_url(browser) ->
+ [url(), "/self-service/registration/browser"].
+
+settings_url(browser) ->
+ [url(), "/self-service/settings/browser"].
+
+recovery_url(browser) ->
+ [url(), "/self-service/recovery/browser"].
+
+verification_url(browser) ->
+ [url(), "/self-service/verification/browser"].
+
+url() ->
+ {ok, Value} = application:get_env(ory, kratos_url),
+ Value.
+
+admin_url() ->
+ {ok, Value} = application:get_env(ory, kratos_admin_url),
+ Value.
+
+registration_flow(Cookie, Id) ->
+ Url = [url(), "/self-service/registration/flows?id=", Id],
+ Headers = [{<<"cookie">>, Cookie}, {"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+login_flow(Cookie, Id) ->
+ Url = [url(), "/self-service/login/flows?id=", Id],
+ Headers = [{<<"cookie">>, Cookie}, {"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+settings_flow(Cookie, Id) ->
+ Url = [url(), "/self-service/settings/flows?id=", Id],
+ Headers = [{<<"cookie">>, Cookie}, {"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+recovery_flow(Cookie, Id) ->
+ Url = [url(), "/self-service/recovery/flows?id=", Id],
+ Headers = [{<<"cookie">>, Cookie}, {"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+verification_flow(Cookie, Id) ->
+ Url = [url(), "/self-service/verification/flows?id=", Id],
+ Headers = [{<<"cookie">>, Cookie}, {"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+logout_flow(Cookie) ->
+ Url = [url(), "/self-service/logout/browser"],
+ Headers = [{<<"cookie">>, Cookie}, {"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+whoami(Cookie) ->
+ Url = [url(), "/sessions/whoami"],
+ Headers = [{<<"cookie">>, Cookie}, {"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+error(Id) ->
+ Url = [url(), "/self-service/errors?id=", Id],
+ Headers = [{"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+get_identity(Id) ->
+ Url = [admin_url(), "/identities/", Id],
+ Headers = [{"accept", "application/json"}],
+ SSLOpts = application:get_env(ory, hackney_ssl_opts, []),
+ Opts = [{ssl_options, SSLOpts}],
+ api_response(hackney:request(get, Url, Headers, <<>>, Opts)).
+
+api_response(Error = {error, Error}) ->
+ logger:error("ory_kratos hackney error: ~p", [Error]),
+ {error, #{<<"code">> => 503, <<"status">> => "Not Available", <<"message">> => "This service isn't available at the moment."}};
+api_response({ok, 200, _, Client}) ->
+ {ok, Body} = hackney:body(Client),
+ {ok, jsone:decode(Body)};
+api_response({ok, _Code, _, Client}) ->
+ {ok, Body} = hackney:body(Client),
+ JSON = #{<<"error">> := Error} = jsone:decode(Body),
+ logger:debug("hydra error: ~p", [JSON]),
+ {error, Error}.