diff --git a/lib/algora/accounts/schemas/user.ex b/lib/algora/accounts/schemas/user.ex index 2e5d1a3b0..4bab015c7 100644 --- a/lib/algora/accounts/schemas/user.ex +++ b/lib/algora/accounts/schemas/user.ex @@ -71,6 +71,8 @@ defmodule Algora.Accounts.User do field :og_title, :string field :og_image_url, :string + field :login_token, :string, virtual: true + has_many :identities, Identity has_many :memberships, Member, foreign_key: :user_id has_many :members, Member, foreign_key: :org_id @@ -247,6 +249,10 @@ defmodule Algora.Accounts.User do |> validate_timezone() end + def login_changeset(%User{} = user, params) do + cast(user, params, [:email, :login_token]) + end + defp validate_email(changeset) do changeset |> validate_required([:email]) diff --git a/lib/algora_web/controllers/user_auth.ex b/lib/algora_web/controllers/user_auth.ex index 5bd011280..a7f27f423 100644 --- a/lib/algora_web/controllers/user_auth.ex +++ b/lib/algora_web/controllers/user_auth.ex @@ -200,8 +200,15 @@ defmodule AlgoraWeb.UserAuth do defp login_code_ttl, do: 3600 defp login_code_salt, do: "algora-login-code" - def generate_login_code(email, domain \\ nil, tech_stack) do - payload = "#{email}:#{domain || ""}:#{Enum.join(tech_stack, ":")}" + def generate_login_code(email) do + sign_login_code(email) + end + + def generate_login_code(email, domain, tech_stack) do + sign_login_code("#{email}:#{domain || ""}:#{Enum.join(tech_stack, ":")}") + end + + def sign_login_code(payload) do Phoenix.Token.sign(AlgoraWeb.Endpoint, login_code_salt(), payload, max_age: login_code_ttl()) end @@ -261,7 +268,7 @@ defmodule AlgoraWeb.UserAuth do For correspondence, please email the Algora founders at ioannis@algora.io and zafer@algora.io - © 2023 Algora PBC. + © 2025 Algora PBC. """ end end diff --git a/lib/algora_web/live/sign_in_live.ex b/lib/algora_web/live/sign_in_live.ex index 626cb833a..86a83f723 100644 --- a/lib/algora_web/live/sign_in_live.ex +++ b/lib/algora_web/live/sign_in_live.ex @@ -2,20 +2,56 @@ defmodule AlgoraWeb.SignInLive do @moduledoc false use AlgoraWeb, :live_view + alias Algora.Accounts.User + alias Swoosh.Email + def render(assigns) do ~H""" -