diff options
author | Jordan Bracco <href@random.sh> | 2022-03-31 07:07:38 +0200 |
---|---|---|
committer | Jordan Bracco <href@random.sh> | 2022-03-31 07:07:38 +0200 |
commit | ec73e94c592e069f6abd44b292d156184a82c3ed (patch) | |
tree | aa56df47f9527f41b1f266d64e37faa8dfed4de2 /src |
Diffstat (limited to 'src')
-rw-r--r-- | src/ory.app.src | 16 | ||||
-rw-r--r-- | src/ory.erl | 3 | ||||
-rw-r--r-- | src/ory_hydra.erl | 67 | ||||
-rw-r--r-- | src/ory_kratos.erl | 103 |
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}. |