2016-04-18 3 views
0

In einer RESTful API habe ich Benutzerressourcen unter /users und /users/:id mit ihren Benutzernamen, E-Mail-Adressen und Passwörtern.Passwort in der RESTful API ändern (Server Validierung auf PATCH)

Wenn ich eine Benutzerinformation aktualisieren möchte, kann ich leicht eine PATCH:/users/:id mit einigen JSONPatch Daten tun.

Das Problem ist jetzt, dass ich nicht herausfinden kann, wie ein Passwort Szenario Änderung mit einer currentPassword, newPassword und newPasswordConfirm Form zu handhaben.

Welche METHODE sollte verwendet werden (PATCH scheint angemessen, aber problematisch) und auf welche Weise sollten die Daten übertragen werden (body/header/...).

In einem weiteren Bereich - wie sollte ein Patch mit weiteren Feldern für die Validierung behandelt werden.

This post scheint verwandt, deckt aber nicht genau dieses Thema ab.

Antwort

5

Statt PATCH, teilweise zu aktualisieren, um eine Benutzer Ressource, haben Sie jemals PUT betrachten das Passwort zu ersetzen?

könnte Ihr Endpunkt sein, wo Passwort ist eine Unterressource der Benutzer Ressource. Und Ihre Anfrage das Passwort zu ersetzen wäre wie:

PUT /users/1/password HTTP/1.1 
Host: api.example.com 
Content-Length: 113 
Content-Type: application/json 
Authorization: Basic YWRtaW46c2VjcmV0 

{ 
    "currentPassword" : "secret", 
    "newPassword": "othersecret", 
    "newPasswordConfirm" : "othersecret" 
} 
+0

Ich habe diese Lösung in Betracht gezogen, wollte aber nicht die einzelnen Felder der API offenlegen. Abgesehen davon würde ich lieber die "POST" -Methode verwenden, da die "PUT" -Operation als idempotent definiert ist, während diese Operation nicht eindeutig ist. – Aides

+0

Würde es Ihnen etwas ausmachen, meine Antwort zu sehen und Feedback zu geben? – Aides

1

Nach einigen tiefer tauchen Sie ein in JSONPatch ich in der Lage war, mit dem Ansatz zu kommen Hinzufügen test Operationen zu den Patch-Daten. Dies könnte etwas aussehen

:

[ 
    { "op": "test", "path": "/password", "value": "oldPassword" }, 
    { "op": "replace", "path": "/password", "value": "newPassword" }, 
    { "op": "test", "path": "/password", "value": "newPasswordConfirm" } 
] 

Gibt es irgendwelche Bedenken mit dieser Methode?

+0

Ich denke, dass dieser Ansatz gut funktionieren wird. Allerdings macht IMHO der "PUT" -Ansatz es klarer. –

+0

Okay, eine Sache, die ein Dealbreaker sein könnte, ist die Tatsache, dass ich sicherstellen müsste, dass der Konsument tatsächlich dieses Anfrageformat verwendet. Ohne weitere serverseitige Validierung könnte ein Verbraucher den Austausch ohne die Testfälle einfach senden. – Aides