2016-12-26 13 views
0

AWS Webサービスにサインする文字列を作成する必要があります。Scalaでクエリ文字列コンポーネントをバイト順で並べ替えるにはどうすればいいですか?

documentationによれば、クエリ文字列コンポーネントをバイト順でソートする必要があります。例えば

は、この:私は次のメソッドを持っている私のコードで

AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE 
Action=DescribeJobFlows 
SignatureMethod=HmacSHA256 
SignatureVersion=2 
Timestamp=2011-10-03T15%3A19%3A30 
Version=2009-03-31 

Action=DescribeJobFlows 
Version=2009-03-31 
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE 
SignatureVersion=2 
SignatureMethod=HmacSHA256 
Timestamp=2011-10-03T15%3A19%3A30 

はこれをソートされ

def getSigningStr(params: Seq[(String, String)]) = 
     "GET\n" + host + "\n/\n" + params.map { 
      case (k, v) => 
      val encV = URLEncoder.encode(v, "UTF-8") 
      s"$k=$encV" 
     }.mkString("&") 

paramsが含まれていSeqですタプル。例えば、("Action", "DescribeJobFlows")getSigningStrをバイトオーダーで並べ替えるにはどのように拡張できますか?あなただけのマッピングの前にsortByを使用して「キー」に並べ替えることができますが、結果はまったく同じと仮定したパラメータでなければなりません - 代わり

def getSigningStr(params: Seq[(String, String)]) = 
    "GET\n" + host + "\n/\n" + params.map { 
    case (k, v) => 
     val encV = URLEncoder.encode(v, "UTF-8") 
     s"$k=$encV" 
    }.sorted.mkString("&") 

+0

おそらく少し誤解を招くと思います大事な事柄。 (大文字は小文字の前に来るが、ASCIIコードは小さい) –

答えて

1

私はあなたがほとんどそこにあると思い、ちょうどこれはあなたのために働く必要があり、このためをソート使用:

def getSigningStr(params: Seq[(String, String)]) = 
     "GET\n" + host + "\n/\n" + params.sorted.map { 
      case (k, v) => 
      val encV = URLEncoder.encode(v, "UTF-8") 
      s"$k=$encV" 
     }.mkString("&") 
1

単なる文字列にそれらを連結する前のparamsの.sortedを追加名前は一意である:

def getSigningStr(params: Seq[(String, String)]) = 
    "GET\n" + host + "\n/\n" + params.sortBy(_._1).map { 
    case (k, v) => 
     val encV = URLEncoder.encode(v, "UTF-8") 
     s"$k=$encV" 
    }.mkString("&") 
1

ヘッダーを辞書順に並べ替える必要があります。バイトオーダでソートする必要があるアマゾンのドキュメントです。バイトオーダーは大文字と小文字が区別されるためです。アマゾンのドキュメントの次の行を参照してください。

クエリ文字列コンポーネントをバイト順でソートします。バイト順序は大文字と小文字が区別されます。 AWSは、ローバイトを に基づいてこれらのコンポーネントをソートします。

だから、また、例えば、Scalaではネイティブ順序でTreeMapをデータ構造を使用することをお勧めし例えば

params.orderBy(_._1.toLowerCase)

、ご発注条件に.toLowerCaseを追加します。例:

var result = TreeMap[String, String]()(Ordering.by(_.toLowerCase)) 
for ((key, value) <- headers) result += key -> value 

あなたはScalaではAWS要求署名者を探している場合は、GitHubの時に私のフォークを確認することができます、私は、彼らがその手紙を言いたかったhttps://github.com/allquantor/aws-request-signer

イワン

関連する問題