Benutzerberechtigungsstufen in einer RESTful-API


23

Nehmen wir an, ich habe eine Firma, die die süßesten Katzen im Internet auflistet.

Ich biete eine Ressource an, in/cats/ der Benutzer die neuesten, süßesten, entzückenden Katzen finden.

Benutzer können entweder nur die Top 3 Katzen bekommen, wenn sie überhaupt nicht bezahlt haben oder registriert sind. Die Top 10 Katzen, wenn sie 337 Dollar bezahlt haben und eingeloggt sind, und die Top 100, wenn sie 1337 Dollar bezahlt haben und eingeloggt sind. Ich habe eine 'Benutzerkennung', wenn ich die Anfrage stelle.

Kurz gesagt, Konsumenten von /cats/bekommen eine andere Anzahl von Katzen, basierend auf ihrer 'Benutzerrangliste' . Ich habe eine Benutzerkennung auf der konsumierenden Seite, aber ich habe keine explizite Darstellung der Benutzerebene auf der konsumierenden Seite. Ich möchte Benutzer darüber informieren, dass sie ihr Abonnement aktualisieren können, wenn sie die Anfrage stellen. Das heißt, ich muss zwischen 3 Katzen unterscheiden, da ich nur 3 Katzen und 3 Katzen anbiete, da dies auf Benutzerebene zulässig ist .

Was ist die beste Methode zur Unterscheidung der Einschränkung der Ressource, weil der Verbraucher nicht über ausreichende Berechtigungen verfügt, und zur Einschränkung der Ressource, weil der Verbraucher über diese Berechtigungen verfügt?

Woher weiß der Kunde, ob er sein Ranking verbessern kann? Das heißt, sie haben nur eine begrenzte Ressource, weil sie keine Berechtigungen haben. Was ist hier die beste Praxis?

Beachten Sie, dass dies eine grobe Vereinfachung des tatsächlichen Falls ist. Auch nur zur Verdeutlichung - Lesen ist erwünscht.


Aktualisieren:

Wir haben folgende Optionen in Betracht gezogen:

  • Speichern Sie die Benutzerberechtigungsobjekte einmal auf dem Client und fragen Sie sie nur ab, wenn eine Kontoanmeldung oder ein Upgrade durchgeführt wird.
  • Das Übergeben von nullWerten in JSON zeigt an, dass es existiert, aber es wurde tatsächlich nichts übertragen. So könnten 10 Katzen für einen Benutzer mit 3 Katzen sein["Garfield","Sylvester","Puss in Boots",null*7]
  • Übergeben eines Ressourcenberechtigungspaars {cats:["Whiskers","Fluffy","Socks"],authCount:3}

Ich würde das gerne gleich beim ersten Mal richtig machen, um die süßesten Katzen bestmöglich auszuliefern, und wir würden und wir würden gerne


4
Jetzt möchte ich Bilder von süßen Katzen sehen
Carrie Kendall

Ich verstehe es nicht. Wenn Sie nirgendwo "Benutzerebene" speichern, können Sie nicht unterscheiden. Es hört sich so an, als hätten Sie auch keine Benutzerinformationen auf dem Server gespeichert, sodass Sie deren Benutzerebene nicht damit speichern können.
Jan Doggen

@JanDoggen Ich habe die Benutzerebene auf dem Server (der Client übermittelt die ID an den Server).
Benjamin Gruenbaum

Hilfe? Ich verstehe die Referenz 1337 nicht?
Marjan Venema

Antworten:


18

Ich würde sagen, es hängt von Ihrem Publikum ab.

No-dev

Wenn Ihr Publikum kein Entwickler ist, würde ich folgendermaßen vorgehen:

Angenommen, Sie geben JSON für das Beispiel zurück.

GET /cats HTTP/1.1

{
    "cats": [
        "Can I haz cheeseburger",
        "If it fits, I sits",
        "It's caturday!"
    ],
    "permissions": {
        "level": "free",
        "information": "You have access to 3 cats. Upgrade to ... to get 10 cats!"
    }
}

Oder etwas ähnliches.

Es ist für den Benutzer informativ, den Status seines Kontos zu kennen, und es ermöglicht Ihnen, die gewünschten Informationen, z. B. eine Marketingnachricht, einzugeben. Der wichtigste Punkt auf diesem Weg ist es, Ihren Benutzern einen leichten Überblick über ihr aktuelles Konto zu verschaffen.

Dev

Wenn Ihre Zielgruppe jedoch nur Entwickler ist, würde ich sagen: Gehen Sie auf die vollständige HTTP-konforme Weise. Zum Speichern der Metadaten verwenden Sie HTTP-Header.

Hier ist ein Beispiel:

GET /cats HTTP/1.1

X-Account: anonymous
X-Account-Possible-Upgrades: 2
X-Account-Limit: 3

Stellen Sie dann eine klare Dokumentation der Bedeutung dieser Überschriften bereit. Die meisten Entwickler werden direkt nach der Dokumentation suchen, wenn sie diese benutzerdefinierten Header sehen, insbesondere wenn sie ein Limit sehen. Sie können noch weiter gehen und den Link in den Kopfzeilen anzeigen. Oder Sie können einen Link zur Preisseite anzeigen.

X-Account-Doc: http://your/doc

Andererseits wissen viele Entwickler nicht, wie HTTP funktioniert.

Also ist es dein Anruf

Einer ist korrekter, der andere ist zugänglicher.

Sonstiges

Einige andere Dinge, die mit Ihrer Frage zu tun haben:


1
Ja, das ist absolut sinnvoll, obwohl ich als Randnotiz finde, dass einige der in den HTTP-Headern enthaltenen Authentifizierungs- (ent / orize) -Informationen ein geeigneter Ansatz sind, da es sich effektiv um Metadaten handelt.
Jimmy Hoffa

@ JimmyHoffa Es handelt sich in der Tat um Metadaten, und mein erster Gedanke war, die HTTP-Header zu verwenden. In diesem Fall bieten HTTP-Header jedoch nicht genügend Transparenz für den Kunden und die für Marketingnachrichten erforderliche Granularität. (Bearbeitet die Antwort, um dieses Detail hinzuzufügen.)
Florian Margaine

@ JimmyHoffa wie? Ein 402 reicht in diesem Fall nicht aus. Was schlagen Sie vor?
Benjamin Gruenbaum

@BenjaminGruenbaum Ich sagte keine Antwortcodes, ich sagte Header; Sie können alle benutzerdefinierten Header hinzufügen, die Sie für Metadaten benötigen. Es ist ratsam, alle Antworten von einer erholsamen API zu haben. Sie müssen lediglich die Benutzerrolle im Header als UserRole = level1oder wie auch immer nennen, um sicherzustellen, dass die Verbraucher immer wissen, wie sie vorgehen sollen Präsentieren Sie alle empfangenen Daten, und es ist für alle Antworten konsistent, bei denen sich die zurückkommenden Datenmodelle von einer Anfrage zur nächsten unterscheiden. Verbraucher können ihre Rolle immer auf die gleiche Weise überprüfen.
Jimmy Hoffa

1
@BenjaminGruenbaum Ich habe die Antwort komplett umgeschrieben.
Florian Margaine

4

Woher weiß der Kunde, ob er sein Ranking verbessern kann?

Das hängt vom Kunden ab. Normalerweise können Sie solche Informationen in Form einer Hyptertextnachricht (auch als HTML bezeichnet) in den Antworttext der REST-Methode einfügen. Dies ist jedoch nur sinnvoll, wenn die REST-API mit einem HTML-Client verwendet wird.

Ähnliches gilt für XML und JSON.


Bearbeiten: Sie könnten die Verwendung einer API (erweitern Sie dieses Akronym) mit der Vermarktung Ihrer Kontotypen / Benutzerpläne verwechseln. Ich würde dies nicht mischen, da es immer faul wird (Geschäftsentscheidungen erfordern möglicherweise schnellere Änderungen als die Änderungen in der Software, um unterschiedliche Antworten zu kommunizieren, da diese Änderungen in der Lage sind, rechtzeitig auf den Plattenteller zu gelangen).

Informieren Sie Ihre Benutzer stattdessen über einen anderen Kanal, z. B. mit dem Newsletter, über deren Vorteile.

Dies funktioniert besonders gut, wenn die Person, die sich beim Dienst anmeldet, nicht mit der API programmiert. Beispielsweise:

George (der im Alter von 36 Jahren ein stolz schwuler Junge ist) kauft sich den Zugang zu cute-cats-4-me.com und fordert seinen 16-jährigen Ehepartner (der sich gut mit Skriptsystemen einschließlich Linux auskennt) auf, einen zu erstellen Digital Signage-Anwendung, die nette kleine süße Kätzchen an der Wand in der Wohnung anzeigt.

Der Typ, der Spaß am Programmieren hat, ist also nicht gerade der direkteste Adressat der Informationen.

Alternativ können Sie als Antwort auf die Anmeldung und eine Benutzerinformationsmethode alle wichtigen Details angeben.

Wenn ein Benutzer jedoch programmgesteuert Katzen anfordert, sollte er bereits wissen, warum er nur drei oder mehr Katzen zurückerhält. Sie lösen dieses Kommunikationsproblem jedoch nicht mit Code.

Andernfalls können sie weitere Abfragen durchführen und eine Fehlermeldung zurückgeben, wenn ihre Rechte nicht ausreichen. Aber auch das ist keine benutzerfreundliche Software.


1
@Racheet: Hast du ein Problem, wenn die Mädchen das Geld im Haus haben und den Jungs sagen, was sie tun sollen?
Hakre

1
Ich habe ein Problem mit einem Beispiel, das besagt, dass Mädchen Freunde brauchen, um für sie zu programmieren.
Racheet
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.