2016-04-08 11 views
1

Ich habe folgendes Setup:Authentifizieren eines CouchDB Benutzer gegen einen externen Server

  1. CouchDB-Datenbank, die Benutzer und führt die Authentifizierung speichert; erstellt eine db pro Benutzer
  2. Web-Anwendung, die PouchDB zu synchronisieren und authentifizieren über pouchdb-authentication verwendet
  3. Ein REST-API-Server, der jetzt kommt, hat die REST-API Admin-Zugriffsanforderungen von dem Web-App und greift auf CouchDB

Wenn es Anfragen empfängt, muss es eine Form der Authentifizierung durchführen, um sicherzustellen, dass der Absender Berechtigungen für die Datenbank hat, auf die er Zugriff hat. Da ich persistente Sitzungen verwende, kennt die Web-App das Benutzerpasswort nicht immer (außer ich speichere es im lokalen Speicher - offensichtlich eine schlechte Idee). Der Sitzungscookie ist HttpOnly, daher kann ich nicht darauf zugreifen.

Was wäre der beste Weg, um Anfragen an die API in diesem Szenario zu authentifizieren?

+0

Ist die REST-Schicht Teil von Couch oder es ist ein unabhängiger Stack dh Java/Tomcat oder PHP/Apache usw.? – Harry

+0

@Harry Unabhängiger Stapel (Rost). – jgillich

+0

Das macht die Dinge viel einfacher. – Harry

Antwort

1

Verschlüsseln Sie alles, was Sie benötigen, und fügen Sie es dem Cookie als base64-Sitzung hinzu. Die folgende würde die Folge sein ...

1. WebApp: Send username and password 
2. REST: Authenticate this using couch. 
3. REST: Encrypt the session along with username password and create cookie, then base64 result. 
4. REST: Send cookie to WebApp. 
5. WebApp: Alway sends cookie back to REST layer. 
6. REST layer has everything it needs to authenticate the user. 

In dem über dem REST-Schicht-Zustand in den WebApp vorbei und es wird den Zustand aus dem WebApp muß. Der Client kann es nicht entschlüsseln, so dass es sicher ist. Der Client gibt dieses Token dann als Cookie zurück an die REST-Schicht, die es dann verwendet, um die Details zu erhalten, die es zur Authentifizierung benötigt.

Sie können einige hundert Bytes recht einfach verschlüsseln und nicht in einen Header oder Cookie Größenbeschränkungen laufen. Komprimieren Sie es vor oder nach der Verschlüsselung nicht vor aus Sicherheitsgründen und nach, da verschlüsselte Daten nicht gut komprimiert werden. Wenn sich jemand Sorgen um die Leistung macht, dann benchmarken Sie es, aber ich habe das mit Sprachen, die Größenordnungen langsamer sind als Rust, verwendet. Eine Variation der oben ist Memcached dh zu verwenden ...

1. WebApp: Send username and password 
2. REST: Authenticate this using couch. 
3. REST: Store Couch session in memcahed along with username password and create cookie. The cookie is the key to memcached. 
4. REST: Send cookie to WebApp. 
5. WebApp: Alway sends cookie back to REST layer. 
6. REST: Get details from memcached. 

ich diese Technik verwendet haben Header und Cookies verwenden und es ist wie ein Charme. Ich gehe davon aus, dass Sie Dinge zum Schutz vor XSRF usw. verwenden.

Sie können die oben genannten Optionen kombinieren und an Ihre Anforderungen anpassen.