WebAuthN auth
This commit is contained in:
69
lib/sso_bsn_web/live/user_settings_live.ex
Normal file
69
lib/sso_bsn_web/live/user_settings_live.ex
Normal file
@@ -0,0 +1,69 @@
|
||||
defmodule SsoBsnWeb.UserSettingsLive do
|
||||
use SsoBsnWeb, :live_view
|
||||
|
||||
alias SsoBsn.Accounts
|
||||
|
||||
def render(assigns) do
|
||||
~H"""
|
||||
<.header class="text-center">
|
||||
Account Settings
|
||||
</.header>
|
||||
|
||||
<div class="space-y-12 divide-y">
|
||||
<div class="space-y-2">
|
||||
<.header>Keys</.header>
|
||||
<ol>
|
||||
<li :for={key <- @current_user.keys}><pre class="truncate"><%= key.key_id %></pre></li>
|
||||
</ol>
|
||||
<.button id="settings-add-key" phx-hook="registrationHook" phx-click="register">
|
||||
Register additional key
|
||||
</.button>
|
||||
</div>
|
||||
<div class="space-y-2">
|
||||
<%= if !@login_url do %>
|
||||
<.button id="show-login-url" phx-click="show-login-url">Show login url</.button>
|
||||
<% else %>
|
||||
<pre><%= @login_url %></pre>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
"""
|
||||
end
|
||||
|
||||
def mount(_params, _session, socket) do
|
||||
{:ok, socket |> assign(login_url: nil)}
|
||||
end
|
||||
|
||||
def handle_event("register", _, socket) do
|
||||
{challenge, challenge_client} = Accounts.registration_challenge(socket.assigns.current_user)
|
||||
|
||||
{:noreply,
|
||||
socket
|
||||
|> assign(challenge: challenge)
|
||||
|> push_event("registration-challenge", challenge_client)}
|
||||
end
|
||||
|
||||
def handle_event("registration-complete", params, socket) do
|
||||
%{current_user: user, challenge: challenge} = socket.assigns
|
||||
|
||||
case Accounts.register_key(user, challenge, params) do
|
||||
{:ok, _key} ->
|
||||
{:noreply,
|
||||
socket |> assign(current_user: Accounts.reload_user(socket.assigns.current_user))}
|
||||
|
||||
{:error, error} ->
|
||||
dbg(error)
|
||||
{:noreply, socket |> put_flash(:error, "An error occured")}
|
||||
end
|
||||
end
|
||||
|
||||
def handle_event("show-login-url", %{}, socket) do
|
||||
token = Accounts.generate_user_login_token(socket.assigns.current_user)
|
||||
|
||||
{:noreply,
|
||||
socket |> assign(login_url: url(socket, ~p"/users/log_in/#{token}"))}
|
||||
end
|
||||
|
||||
def handle_event("error", payload, socket),
|
||||
do: {:noreply, socket |> put_flash(:error, inspect(payload))}
|
||||
end
|
||||
Reference in New Issue
Block a user