Store Last.fm API key with encrypted secret

This commit is contained in:
Claudio Ortolina
2025-05-06 15:18:14 +01:00
parent d5b29b20bb
commit 95f71519d3
12 changed files with 87 additions and 9 deletions
+1
View File
@@ -9,6 +9,7 @@ defmodule MusicLibrary.Application do
def start(_type, _args) do
children = [
MusicLibraryWeb.Telemetry,
MusicLibrary.Vault,
MusicLibrary.Repo,
MusicLibrary.ErrorRepo,
MusicLibrary.BackgroundRepo,
+3
View File
@@ -0,0 +1,3 @@
defmodule MusicLibrary.Encrypted.Binary do
use Cloak.Ecto.Binary, vault: MusicLibrary.Vault
end
+14
View File
@@ -0,0 +1,14 @@
defmodule MusicLibrary.Secrets do
alias MusicLibrary.Repo
alias MusicLibrary.Secrets.Secret
def store(name, value) do
%Secret{}
|> Secret.changeset(%{name: name, value: value})
|> Repo.insert(on_conflict: :replace_all)
end
def get!(name) do
Repo.get!(Secret, name)
end
end
+17
View File
@@ -0,0 +1,17 @@
defmodule MusicLibrary.Secrets.Secret do
use Ecto.Schema
import Ecto.Changeset
@primary_key {:name, :string, autogenerate: false}
schema "secrets" do
field :value, MusicLibrary.Encrypted.Binary
timestamps(type: :utc_datetime)
end
def changeset(secret, attrs) do
secret
|> cast(attrs, [:name, :value])
|> validate_required([:name, :value])
end
end
+3
View File
@@ -0,0 +1,3 @@
defmodule MusicLibrary.Vault do
use Cloak.Vault, otp_app: :music_library
end
@@ -1,18 +1,18 @@
defmodule MusicLibraryWeb.LastFmController do
use MusicLibraryWeb, :controller
def callback(conn, %{"token" => token}) do
case LastFm.get_session(token) do
{:ok, session} ->
conn
|> put_session(:last_fm_user, session.name)
|> put_session(:last_fm_key, session.key)
|> put_flash(:info, "Successfully authenticated with Last.fm.")
|> redirect(to: ~p"/")
alias MusicLibrary.Secrets
def callback(conn, %{"token" => token}) do
with {:ok, session} <- LastFm.get_session(token),
{:ok, _secret} <- Secrets.store("last_fm_key", session.key) do
conn
|> put_flash(:info, gettext("Successfully connected your Last.fm account"))
|> redirect(to: ~p"/")
else
{:error, reason} ->
conn
|> put_flash(:error, "Failed to authenticate with Last.fm: #{reason}")
|> put_flash(:error, "Failed to connect your Last.fm account: #{reason}")
|> redirect(to: ~p"/")
end
end