aboutsummaryrefslogtreecommitdiff
path: root/src/ory_kratos.erl
blob: 162df05d95a0d1ec3d5460a2a46e27d5aaa756a0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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}.