Spaces:
Running
Running
| -- 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; | |
| $$; | |