2012-10-25 9 views
12

Ich betrachte die folgenden zwei Möglichkeiten, den Mieter einer HTTP-Anforderung in einer Multi-Tenant-Umgebung zu identifizieren - hartzucodieren die Mieter in der URI:Übergibt den Mandanten in einem benutzerdefinierten HTTP-Header RESTful?

/{tenantUuid}/foos/{id}

oder den Mieter in einem benutzerdefinierten HTTP vorbei Header, wie zum Beispiel:

X-Auth-Token: 7d2f63fd-4dcc-4752-8e9b-1d08f989cc00"

(ähnlich wie: http://docs.openstack.org/api/quick-start/content/)

beachte, dass die {id} ist für alle Mandanten eindeutig - so kann /{tenantUuid}/foos/{id} immer noch eine foo Ressource eindeutig identifizieren.

Meine Frage ist - ist es theoretisch richtig, einen benutzerdefinierten Header dafür zu verwenden, oder ist die Verwendung eines benutzerdefinierten Headers nicht erholsam. Ich bin mir auch bewusst, dass X-... Header veraltet sind, aber die Frage ignoriert diese Tatsache.

Danke.

Antwort

7

Der URI sollte die Ressource eindeutig identifizieren.

Aber das ist orthogonal zu Autorisierung und Zugriff. Zwei Personen könnten nach der gleichen Ressource fragen und man bekommt nichts, und kopiert oder, und Fehler, während die andere das Ganze bekommen würde, weil sie im Berechtigungsheader richtig identifiziert sind.

Jetzt kann der URI die Mandanten-ID als Teil seiner eindeutigen URI enthalten, daran ist nichts falsch. Wie auch immer, die Ressource selbst wird (irgendwie, auch durch eine Komponente ihres URI oder einen internen Zustand) "wissen", zu welchem ​​Mandanten sie gehört.

In diesem Fall sollten Sie den HTTP Authorization-Header verwenden, um den Anforderer ordnungsgemäß zu identifizieren und diese Informationen dann verwenden, um intern zu bestimmen, ob und was die Antwort für eine bestimmte Anfrage sein wird. Ein Anforderer kann berechtigt sein, keinen, einen, einige oder alle Mandanten in einem System zu sehen.

Sie sollten keinen benutzerdefinierten Header für diesen Anwendungsfall überhaupt benötigen.

1

Wenn Sie die Mandanten-ID zum Identifizieren der Ressource benötigen, dann wäre der REST-konforme Weg, sie in der URL zu haben. Wenn Sie dies nicht tun (id ist über die Mandanten hinweg eindeutig), dann brauchen Sie es technisch nicht in der URL oder der Kopfzeile.

Da ID für alle Mandanten eindeutig ist, kann/foos/{id} diese Ressource eindeutig identifizieren und ist RESTful.

Ich würde vermeiden, benutzerdefinierte Header als eine Möglichkeit zum Adressieren einer Ressource verwenden. Sie sollten stattdessen verwendet werden, um zusätzliche Informationen wie Akzeptiertypen, Authentifizierungstoken usw. zu übergeben. Sie müssen entscheiden, ob es entscheidend ist, die Ressource zu identifizieren und sie in die URL einzugeben oder nicht.

0

Es könnte genauso interessant für Ihre App sein, Benutzer von verschiedenen Mietern zu trennen als für App wie Craigs Liste, um sie von Städten zu trennen.

Aber möchten Sie alle Arten von Trennungen in Ihrem URI zeigen? Möchten Sie einen URI wie /comcast/blackeyes/long-haired/london/?

RESTful oder RESTenough wird diese Frage nicht beantworten. Es ist nur eine Frage des Geschmacks.