Terminal / migrations /p38_managed_tokens.sql
Baida-A
Initial clean deploy (Reverse Proxy removed)
28a08e7
Raw
History Blame Contribute Delete
2.36 kB
-- backend/migrations/p38_managed_tokens.sql
-- OAuth Managed Tokens: connettori one-click (GitHub, Google, Instagram, …)
-- Eseguire nel SQL Editor di Supabase (idempotente).
--
-- Tabella: managed_tokens
-- Scopo: store encrypted OAuth access/refresh token per provider, per user.
-- Token cifrati con Fernet (VAULT_KEY) prima della scrittura — mai in chiaro su DB.
CREATE TABLE IF NOT EXISTS public.managed_tokens (
id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::TEXT,
user_id TEXT NOT NULL DEFAULT 'default',
provider TEXT NOT NULL, -- 'github' | 'google' | 'instagram'
access_token TEXT NOT NULL DEFAULT '', -- encrypted (Fernet)
refresh_token TEXT NOT NULL DEFAULT '', -- encrypted (Fernet, vuoto se non fornito)
expires_at BIGINT NOT NULL DEFAULT 0, -- UNIX ms, 0 = non-expiring
scope TEXT NOT NULL DEFAULT '', -- scopes concessi dal provider
raw_meta TEXT NOT NULL DEFAULT '{}', -- JSON extra (email, avatar, ecc.)
created_at BIGINT NOT NULL DEFAULT 0,
updated_at BIGINT NOT NULL DEFAULT 0,
UNIQUE (user_id, provider)
);
CREATE INDEX IF NOT EXISTS managed_tokens_user_idx
ON public.managed_tokens (user_id, provider);
-- RLS: solo service_role può leggere/scrivere (token sono segreti)
ALTER TABLE public.managed_tokens ENABLE ROW LEVEL SECURITY;
DO $$ BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_policies
WHERE tablename = 'managed_tokens' AND policyname = 'service only'
) THEN
CREATE POLICY "service only" ON public.managed_tokens
FOR ALL TO service_role
USING (true)
WITH CHECK (true);
END IF;
END $$;
-- Tabella oauth_states: CSRF state tokens (pulizia automatica dopo 10min)
-- Usata dal backend per validare i callback OAuth (state parameter)
CREATE TABLE IF NOT EXISTS public.oauth_states (
state TEXT PRIMARY KEY,
provider TEXT NOT NULL,
user_id TEXT NOT NULL DEFAULT 'default',
created_at BIGINT NOT NULL DEFAULT 0
);
-- Pulizia automatica stati scaduti (>10min = 600000ms)
CREATE OR REPLACE FUNCTION public._purge_oauth_states() RETURNS void
LANGUAGE plpgsql AS $$
BEGIN
DELETE FROM public.oauth_states
WHERE created_at < (EXTRACT(EPOCH FROM NOW()) * 1000 - 600000)::BIGINT;
END;
$$;