Fornire un URL a un allegato di un documento CouchDB senza fornire nome utente / password?

2

Ho postato questa domanda su DBA, ma è stata chiusa e non è mai stata riaperta nemmeno dopo che ho riscritto l'intera faccenda per essere più specifico. Penso che sia più appropriato per i programmatori comunque:)

Informazioni di base

Ho un server CouchDB (Server B) a cui si accede da un altro server che esegue PHP (Server A). La mia app Web (Javascript sul lato client) effettua una richiesta per un file sul server A. Il server A invia richieste al server B con le credenziali di accesso (nome utente: password). Il server B restituisce oggetti JSON che corrispondono a file corrispondenti, quindi il server A restituisce tali dati al client. La risposta include alcuni metadati relativi al file e un URL al file sul Server B. I dati del file stesso non sono inclusi nella risposta.

Il problema

L'URL dell'allegato del documento incluso nella risposta JSON dal server B include le credenziali di accesso (nome utente: password). Il server A risponde alla richiesta lato client restituendo tali oggetti JSON.

Il client ora ha questa informazione:

https://username:password@host:port/dbname/path/to/file.whatever

Attualmente tutti i dati contenuti nel Server B risiedono in un'istanza di database. Se il client ha accesso al nome utente: password al CouchDB, allora tutti i dati potrebbero essere interrogati con tali credenziali di accesso. Mi piace così,

https://username:password@host:port/dbname/_all_docs

Considerazioni sul lato server

CouchDB su Cloudant

Considerazioni sul lato client

Il Javascript in esecuzione sul client richiede una stringa URL per il file. I file a cui si fa riferimento sono strati KML per Google Maps. Un nuovo layer KML viene creato utilizzando questo costruttore.

Cosa sto cercando

Essenzialmente la mia soluzione verrebbe se potessi fornire un collegamento a un allegato di un documento CouchDB senza fornire nome utente / password.

https://host:port/path/to/file.whatever

Cosa ho fatto

Ho dovuto abilitare cURL per PHP sul server A.

sudo apt-get install curl libcurl3 libcurl3-dev php5-curl
sudo /etc/init.d/apache2 restart

Hai un po 'di codice dal blog di David Walsh.

Il mio codice client Javascript ottiene un elenco di metadati del file JSON dal server A. Questi dati includono ID DB univoci e nomi di file (Nessuna password o chiave API). Passo quindi l'ID del documento e il nome del file a un altro servizio sul server A che riecheggia il valore di

get_data('https://username:password@Server B:port/dbname/path/to/file.whatever');

Ora posso fornire i file al client senza rivelare nome utente o password per CouchDB sul Server B.

    
posta cs_brandt 22.05.2012 - 19:57
fonte

2 risposte

2

Non credo che sarai in grado di fare ciò che vuoi senza aprire tutti i documenti CouchDB a tutti gli spettatori.

La soluzione è, credo, solo per inviare al client questa porzione dell'URL del documento restituito:

dbname/path/to/file.whatever

E poi tieni il tuo cliente a parlare con il Server A:

https://Server A/get_document/dbname/path/to/file.whatever

Il server A quindi lo converte nel modulo di restituzione Server B:

https://username:password@host:port/dbname/path/to/file.whatever

In questo modo il client non ha mai bisogno di sapere del server B, e il server B può essere bloccato lontano da occhi indiscreti.

    
risposta data 22.05.2012 - 22:19
fonte
0

Sembra che tu voglia che i documenti che l'utente finale riceve vengano pubblicati direttamente dal server del database. In generale, questa è una cattiva idea. Soprattutto se si tratta di un'applicazione pubblica. È meglio isolare il database come lo avete ora. C'è una ragione particolare per cui ritieni che il db abbia bisogno di consegnare direttamente al cliente il documento?

Manterò tutto nella tua applicazione middleware e manterrò quella consegna del documento. O se è necessario, creare un'applicazione server separata che gestisca solo il trasferimento di documenti tra client e db. Il client richiederebbe un URL del documento e il server dell'app lo scaricherà dal db e lo restituirà al client.

    
risposta data 22.05.2012 - 20:12
fonte

Leggi altre domande sui tag