Ich habe eine Service Provider-Implementierung für OAuth geschrieben, und einer der Devs hat einen Fehler bei der Implementierung der Abfrageparameter gefunden. Ich vermisste völlig die lexicographical ordering Anforderung in der OAuth-Spezifikation und wurde nur eine einfache Zeichenfolge Art auf den Namen WertparameterOAuth - lexikographischer Byte-Wert in C#
Angesichts der folgenden URI-Anforderung von dem Verbraucher zu tun:
http://api.com/v1/People/Search?searchfor=fl&[email protected]&Include=addresses
Die resultierende Signaturbasis sollte die Reihenfolge Parameter wie:
http://api.com/v1/People/Search?searchfor=fl&[email protected]&include=addresses
:
Include=addresses, [email protected], searchfor=fl
die folgende URI-Anforderung von dem Verbraucher Gegeben
sollte die sich ergebende Signatur, die Parameter als Basis bestellen:
[email protected], include=addresses, searchfor=fl
Beachten Die Differenz in der Abfragezeichenparameter „enthalten“. Von dem, was ich verstehe, wird lexikographische Byte-Wert-Reihenfolge Parameter mit dem Ascii-Wert bestellen und dann Bestellung asc.
Da I = 73 und i = 105, sollte das Kapital I vor dem Kleinbuchstaben i bestellt werden.
Ich habe folgendes bisher:
IEnumerable<QueryParameter> queryParameters = parameters
.OrderBy(parm => parm.Key)
.ThenBy(parm => parm.Value)
.Select(
parm => new QueryParameter(parm.Key, UrlEncode(parm.Value)));
Aber das wird das ASCII-Zeichen für Zeichen Art nicht decken (INCLUDE = Test & Include = Test nicht richtig sortieren).
Irgendwelche Gedanken darüber, wie man einen effizienten Algorithmus entwickelt, der dieses Problem löst? Oder wie man die Sortierung über ICompare sensitiv macht?
Andrew: Thx für die Antwort. Ich habe meine eigene Implementierung von Service Provider aus 2 Gründen gerollt: 1.Ich wollte das OAuth-Protokoll für mich selbst und für unsere Kunden verstehen - welchen besseren Weg, um Verständnis zu erlangen, als indem wir es tun 2. Es gibt Geschäftsfälle, die eine Erweiterung des Protokolls erforderten - https://demo.staging.fellowshiponeapi.com/v1/ Util/AuthDocs.help Ich habe DotNetOpenAuth betrachtet, es scheint wie eine sehr glatte Implementierung - Sie müssen es kaputt gemacht haben, um so viel Funktionalität in dort zu bekommen, wie Sie taten! – Nick