2017-08-03 12 views
1

私はTwitter APIへのリクエストをしようとしており、リクエストに署名する必要があります。その最後の部分は、HMAC-SHA1ハッシュアルゴリズムによる署名が必要です。それを得るための簡単な方法はありますか?OCamlのHMAC-SHA1署名?

答えて

1

ハンネスが(むしろOCamlのより、以下ReasonML構文で)私に答えを与えるために伸ばし:

Nocrypto.Hash.SHA1.hmac key::(Cstruct.of_string signingKey) (Cstruct.of_string output) |> Cstruct.to_string 

ということで、ここにTwitter API doc(のparamsから翻訳し、値も取られて署名機能です出力が正しいとして検証可能であるので、そのページから):

let signRequest clientId clientSecret method uri params :string => { 
    let tmp = params |> List.sort (fun (a, _) (b, _) => compare a b); 
    let collectedParamsString = 
    List.map 
     (
     fun (header: string, values: list string) => { 
      let nextStr = 
      List.fold_left 
       (
       fun innerAcc value => { 
        let nextItem = 
        /* Using `Userinfo here is weird, but it's the only component I could get to properly percent-encode things in the same way Twitter expects it */ 
        Uri.pct_encode component::`Query_key header^
        "="^Uri.pct_encode component::`Userinfo value; 
        let final = innerAcc @ [nextItem]; 
        print_endline (value^" => "^String.concat "&" final); 
        final 
       } 
      ) 
       [] 
       values |> 
      String.concat "&"; 
      nextStr 
     } 
    ) 
     tmp |> 
    String.concat "&"; 
    let output = 
    String.uppercase_ascii method^
    "&"^
    Uri.pct_encode component::`Userinfo uri^
    "&"^Uri.pct_encode component::`Userinfo collectedParamsString; 
    let signingKey = 
    Uri.pct_encode component::`Userinfo clientId^
    "&"^Uri.pct_encode component::`Userinfo clientSecret; 
    Cstruct.to_string (
    Nocrypto.Hash.SHA1.hmac key::(Cstruct.of_string signingKey) (Cstruct.of_string output) 
) 
}; 

let signature = 
    signRequest 
    "post" 
    "https://api.twitter.com/1.1/statuses/update.json" 
    "kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw" 
    "LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE" 
    [ 
     ("status", ["Hello Ladies + Gentlemen, a signed OAuth request!"]), 
     ("include_entities", ["true"]), 
     ("oauth_consumer_key", ["xvz1evFS4wEEPTGEFPHBog"]), 
     ("oauth_nonce", ["kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg"]), 
     ("oauth_signature_method", ["HMAC-SHA1"]), 
     ("oauth_timestamp", ["1318622958"]), 
     ("oauth_token", ["370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb"]), 
     ("oauth_version", ["1.0"]) 
    ]; 
/* let signature : string = "hCtSmYh+iHYCEqBWrE7C7hYmtUk */ 

編集: - それは実際にデビッドKaloperだ私はもともとハネスはOCamlでのnocryptoライブラリの作者であると述べました。大変申し訳ありませんが、DanielBünzli氏に感謝の意を表します。

+1

Hannesはnocryptoの著者ではありません。 nocryptoの著者はDavid Kaloperです。 https://opam.ocaml.org/packages/nocrypto/ –

+0

を参照してください。 'Nocrypto.Hash.SHA1.hmac'の出力を取得したら、B64.encodeを実行して一致させるために' hCtSmYh + iHYCEqBWrE7C7hYmtUk = 'を得る必要がありましたあなたのテストケース。 –