无法验证Moodle发送的OAuth1签名。

问题描述 投票:0回答:1

早上好,我正试图在OCaml中实现OAuth1认证,以获得安全的LTI请求与Moodle.I的一些问题,当我想重建OAuth1签名:不匹配与Moodle.I的。

我试图在OCaml中实现OAuth1认证,以获得Moodle的安全LTI请求。当我想重建OAuth1签名时,我遇到了一些麻烦:它与Moodle在POST有效载荷中发送给我的签名不匹配。

我按照以下步骤手动建立了OAuth的签名。 的文件资料和 OAuth核心 规范。

下面是我的函数。

let signature_oauth liste_args http_method basic_uri consumer_key secret =
    let couple_encode = (* 1 : encode keys/values *)
      List.map (
          fun (k,v) -> (Netencoding.Url.encode ~plus:false k, Netencoding.Url.encode ~plus:false v))
      @@ convert_to_gapi liste_args
    in
    let couple_trie =   (* 2 : sort by key [and value] *)
      List.sort   
        (fun (k1, v1) (k2,v2) ->
          let res = compare k1 k2 in
          if res = 0 then compare v1 v2 else res) couple_encode
    in 
    let liste_concat =  (* 3 : key=value&key2=value2 *)
      String.concat "&"
      @@ List.map
           (fun (k,v) -> k ^ "=" ^ v) couple_trie
    in 
    let signature_base_string =     (* 4 :add HTTP_method and uri *)
      sprintf "%s&%s&%s" (String.uppercase_ascii http_method) (Netencoding.Url.encode ~plus:false basic_uri) (Netencoding.Url.encode ~plus:false liste_concat)
    in
    let signing_key = (Netencoding.Url.encode ~plus:false consumer_key) ^ "&" ^ (Netencoding.Url.encode ~plus:false secret) in  (* 5 : Créer la signing_key *)
    let encodage = Netencoding.Base64.encode
                   @@ Cstruct.to_string
                   @@ Nocrypto.Hash.SHA1.hmac (Cstruct.of_string signing_key) (Cstruct.of_string signature_base_string)
    in
   encodage  
  • 我的函数调用。signature_oauth liste_args "post" "localhost:8000/launch" !oauth_consumer_key my_secret
  • liste_args 参数是由"& "分割的payload(例如:[oauth_version=1.0;oauth_nonce=5aa374e2728914002261bbb7b4bd8e3e];...)。
  • convert_to_gapi函数将这个函数转换为 liste_args 在情侣列表中(Ex : [(oauth_version,1.0);(oauth_nonce,5aa374e2728914002261bbb7b4bd8e3e);...]。它还 去掉oauth_signature.
  • 有效载荷是: applicationx-www-form-urlencoded 编码。

这里是一个例子,我可以收到一个有效载荷。

oauth_version=1.0&oauth_nonce=5aa374e2728914002261bbb7b4bd8e3e&oauth_timestamp=1588583843&oauth_consumer_key=rfrezFZErzfzHJmpmkBFT&user_id=2&lis_person_sourcedid=&roles=Instructor%2Curn%3Alti%3Asysrole%3Aims%2Flis%2FAdministrator%2Curn%3Alti%3Ainstrole%3Aims%2Flis%2FAdministrator&context_id=2&context_label=CT&context_title=Cours+test&resource_link_title=Test&resource_link_description=&resource_link_id=2&context_type=CourseSection&lis_course_section_sourcedid=1&lis_result_sourcedid=%7B%22data%22%3A%7B%22instanceid%22%3A%222%22%2C%22userid%22%3A%222%22%2C%22typeid%22%3A%221%22%2C%22launchid%22%3A2096392689%7D%2C%22hash%22%3A%225dbc6bff5ec32c9eee91ee3dcb476b3a553ae5337f8a21b3876b52e4e6cf862c%22%7D&lis_outcome_service_url=http%3A%2F%2Flocalhost%2Fmod%2Flti%2Fservice.php&lis_person_name_given=Admin&lis_person_name_family=User&lis_person_name_full=Admin+User&ext_user_username=user&lis_person_contact_email_primary=user%40example.com&launch_presentation_locale=en&ext_lms=moodle-2&tool_consumer_info_product_family_code=moodle&tool_consumer_info_version=2019111802&oauth_callback=about%3Ablank&lti_version=LTI-1p0&lti_message_type=basic-lti-launch-request&tool_consumer_instance_guid=localhost&tool_consumer_instance_name=%22New+Site%22&tool_consumer_instance_description=%22New+Site%22&launch_presentation_document_target=iframe&launch_presentation_return_url=http%3A%2F%2Flocalhost%2Fmod%2Flti%2Freturn.php%3Fcourse%3D2%26launch_container%3D3%26instanceid%3D2%26sesskey%3DPPPY9j3N8D&oauth_signature_method=HMAC-SHA1&oauth_signature=fuB7Qm0MXLrHPrvniQsBNcvj7BA%3D

我试着把OAuth1的签名用一个 酒窖 但我得到的签名和我的函数一样。

我想我在创建签名的过程中缺少了一些东西。

我使用和Moodle相同的参数(在有效载荷中发送)来创建签名,使用相同的 密匙 和相同的算法。

  • 在OAuth1的文档中,我看到他们没有使用 oauth_callback 但Moodle却有,我应该把它删除吗?
  • 他们说的是一个 oauth_token 也是。但是Moodle没有给我一个,我也不知道如何获得它。它是必不可少的,以建立签名?

先谢谢你的帮助。

oauth ocaml moodle hmacsha1 lti
1个回答
0
投票

我找到了答案,它有2个错误。

第一个是 签约密钥 : 我只需要做 (Netencoding.Url.encode ~plus:false secret) ^ "&"

另一个是来自Moodle的:当你配置一个 "自动工具,基于工具URL",然后切换到一个 课程工具Moodle并不关心课程工具的配置。您需要首先删除自动工具的所有字段,然后切换到您的自动工具。课程工具.

是什么帮助我了解。

© www.soinside.com 2019 - 2024. All rights reserved.