2009-05-08 14 views
1

OAuth用のサービスプロバイダの実装を書いており、実装者がクエリパラメータを注文する方法にバグを発見しました。私は完全にOAuthの仕様でlexicographical ordering要件を逃しただけの名前と値のパラメータの基本的な文字列の並べ替えをしていたOAuth - Cでの辞書順バイト値の順序付け

消費者から次のURI要求を考える:

http://api.com/v1/People/Search?searchfor=fl&[email protected]&Include=addresses 

たシグニチャベースを注文する必要があります

http://api.com/v1/People/Search?searchfor=fl&[email protected]&include=addresses 
:消費者から次のURI要求を考えると

Include=addresses, [email protected], searchfor=fl 

:パラメータとして

得られた署名ベースのようなパラメータを注文する必要があります。「含む」クエリ文字列パラメータの場合の違いに注意してください

[email protected], include=addresses, searchfor=fl 

。私が理解していることから、辞書順バイト値の順序はascii値を使用してパラメータを順序付けし、ascをオーダーします。

I = 73でi = 105なので、大文字Iは小文字iより前に並べる必要があります。

は、私がこれまでに次き:

IEnumerable<QueryParameter> queryParameters = parameters 
.OrderBy(parm => parm.Key) 
.ThenBy(parm => parm.Value) 
.Select(
parm => new QueryParameter(parm.Key, UrlEncode(parm.Value))); 

をしかし、それは文字の並び替えASCII文字をカバーしています(INCLUDE =テスト&は=テストが含まれますない正しく並べ替え)。

この問題に答える効率的なアルゴリズムを作成する方法についてのご意見はありますか?または、ICompareを介してソートの大文字小文字を区別する方法は?

答えて

0

私はカスタム比較子を作成することで問題を解決し、しかし、それは不格好ようだと私はより良い方法がなければならないと感じ:序文字列比較を使用して

public class QueryParameterComparer : IComparer<QueryParameter> { 
    public int Compare(QueryParameter x, QueryParameter y) { 
      if(x.Key == y.Key) { 
      return string.Compare(x.Value, y.Value, StringComparison.Ordinal); 
      } 
      else { 
      return string.Compare(x.Key, y.Key, StringComparison.Ordinal); 
      } 
    } 
} 

は私のためにそれをやったことです。それは私が必要としていたものとまったく同じバイト比較をします。

0

ニック、あなたが発見したように、StringComparison.Ordinalは道のりです。それぞれのキーと値をURIエンコードした後で並べ替えるように注意する必要があります。

ところで、既にいくつかのOAuthライブラリがあります。DotNetOpenAuthは私のお気に入りです(免責事項:偏った理由のため)。あなたはこれを構築/維持してもよろしいですか?

+0

アンドリュー: 応答のためのThx。私は自分のサービスプロバイダ実装をロールバックしました。理由は2つあります 1。 より理解を深めるには、より良い方法はありません。2.プロトコルを拡張する必要があるビジネスケースがあります.- https://demo.staging.fellowshiponeapi.com/v1/ Util/AuthDocs.help 私はDotNetOpenAuthを見てきました。これは非常に滑らかな実装のようです。あなたが行ったのと同じように多くの機能を利用するには、それを破棄したに違いありません。 – Nick

0

(それは、OAuthのドキュメントにはもうスペルが間違っていないが。 - それはそれはスペルミスされた場所の場合)私は同じ表現に問題があった

ウィキペディアサイス、「lexicographical ordering」は意味を持ち、手紙順序が与えられる。要素の順序が既に指定されている場合、一連の要素(文字)の順序を指定します。

私にとっては妥当な音です。 :)。

関連する問題