2017-05-05 150 views
3

我正在Python中開發LTI工具提供程序,並且在獲取LTI 1.x基本啓動工作或內容項目規範的任何方面都沒有問題。儘管嘗試使用LTI 2註冊機制,但我撞到了一堵巨大的磚牆。LTI 2工具代理註冊失敗,出現400或500錯誤

每當我在某些工具使用者上運行我的代碼時,當我將工具代理髮布到工具使用者配置文件中列出的工具代理端點時,我得到的都是400錯誤。

我已經試過這:

  • http://lti.tools/test/tc.php(寄存器成功與)的AWS(400錯誤的請求)
  • Moodle的3.3 runnong在本地主機(寄存器成功與)
  • 帆布運行
  • 的Moodle 3.2 (400錯誤的請求){ 「錯誤」: 「無效的能力」}

遺憾的是沒有什麼給我任何關於請求有什麼不好的想法。我90%確定它是JSON或標題中的某些內容。我很確定它不是oAuth(感謝下面的評論以及它在4​​個測試環境中的2箇中起作用的事實)

據說Moodle爲你提供了一些輸出,但我已經到處尋找並沒有找到它。我從站點管理員菜單中打開了開發模式,並按照關於如何確保錯誤記錄在PHP中的幾個指示,並且我找不到任何地方。

最初我無法在任何地方工作,但我能夠將xdebug連接到本地Moodle 3.3實例,這就是我終於能夠實現這一目標的原因。

這裏是帆布工具消費簡介:

{'@context': 
    ['http://purl.imsglobal.org/ctx/lti/v2/ToolConsumerProfile'], 
    '@id': 'https://canvas.instructure.com/api/lti/courses/1146163/tool_consumer_profile/339b6700-e4cb-47c5-a54f-3ee0064921a9', 
    '@type': 'ToolConsumerProfile', 
    'capability_offered': ['basic-lti-launch-request', 
         'User.id', 
         'Canvas.api.domain', 
         'LtiLink.custom.url', 
         'ToolProxyBinding.custom.url', 
         'ToolProxy.custom.url', 
         'Canvas.placements.accountNavigation', 
         'Canvas.placements.courseNavigation', 
         'Canvas.placements.assignmentSelection', 
         'Canvas.placements.linkSelection', 
         'Canvas.placements.postGrades', 
         'User.username', 
         'Person.email.primary', 
         'vnd.Canvas.Person.email.sis', 
         'Person.name.given', 
         'Person.name.family', 
         'Person.name.full', 
         'CourseSection.sourcedId', 
         'Person.sourcedId', 
         'Membership.role', 
         'ToolConsumerProfile.url', 
         'Security.splitSecret', 
         'Context.id', 
         'ToolConsumerInstance.guid', 
         'CourseSection.sourcedId', 
         'Membership.role', 
         'Person.email.primary', 
         'Person.name.given', 
         'Person.name.family', 
         'Person.name.full', 
         'Person.sourcedId', 
         'User.id', 
         'User.image', 
         'Message.documentTarget', 
         'Message.locale', 
         'Context.id', 
         'vnd.Canvas.root_account.uuid'], 
'guid': '339b6700-e4cb-47c5-a54f-3ee0064921a9', 
'lti_version': 'LTI-2p0', 
'product_instance': {'guid': '07adb3e60637ff02d9ea11c7c74f1ca921699bd7.canvas.instructure.com', 
         'product_info': {'product_family': {'code': 'canvas', 
                  'vendor': {'code': 'https://instructure.com', 
                    'timestamp': '2008-03-27T06:00:00Z', 
                    'vendor_name': {'default_value': 'Instructure', 
                        'key': 'vendor.name'}}}, 
             'product_name': {'default_value': 'Canvas ' 
                     'by ' 
                     'Instructure', 
                 'key': 'product.name'}, 
             'product_version': 'none'}, 
         'service_owner': {'description': {'default_value': 'Free ' 
                     'For ' 
                     'Teachers', 
                 'key': 'service_owner.description'}, 
             'service_owner_name': {'default_value': 'Free ' 
                       'For ' 
                       'Teachers', 
                   'key': 'service_owner.name'}}}, 
'security_profile': [{'digest_algorithm': 'HMAC-SHA1', 
         'security_profile_name': 'lti_oauth_hash_message_security'}, 
         {'digest_algorithm': 'HS256', 
         'security_profile_name': 'oauth2_access_token_ws_security'}], 
'service_offered': [{'@id': 'https://canvas.instructure.com/api/lti/courses/1146163/tool_consumer_profile/339b6700-e4cb-47c5-a54f-3ee0064921a9#ToolProxy.collection', 
         '@type': 'RestService', 
         'action': ['POST'], 
         'endpoint': 'https://canvas.instructure.com/api/lti/courses/1146163/tool_proxy', 
         'format': ['application/vnd.ims.lti.v2.toolproxy+json']}, 
        {'@id': 'https://canvas.instructure.com/api/lti/courses/1146163/tool_consumer_profile/339b6700-e4cb-47c5-a54f-3ee0064921a9#ToolProxy.item', 
         '@type': 'RestService', 
         'action': ['GET'], 
         'endpoint': 'https://canvas.instructure.com/api/lti/tool_proxy/{tool_proxy_guid}', 
         'format': ['application/vnd.ims.lti.v2.toolproxy+json']}, 
        {'@id': 'https://canvas.instructure.com/api/lti/courses/1146163/tool_consumer_profile/339b6700-e4cb-47c5-a54f-3ee0064921a9#vnd.Canvas.authorization', 
         '@type': 'RestService', 
         'action': ['POST'], 
         'endpoint': 'https://canvas.instructure.com/api/lti/courses/1146163/authorize', 
         'format': ['application/json']}, 
        {'@id': 'https://canvas.instructure.com/api/lti/courses/1146163/tool_consumer_profile/339b6700-e4cb-47c5-a54f-3ee0064921a9#ToolProxySettings', 
         '@type': 'RestService', 
         'action': ['GET', 'PUT'], 
         'endpoint': 'https://canvas.instructure.com/api/lti/tool_settings/tool_proxy/{tool_proxy_id}', 
         'format': ['application/vnd.ims.lti.v2.toolsettings+json', 
           'application/vnd.ims.lti.v2.toolsettings.simple+json']}, 
        {'@id': 'https://canvas.instructure.com/api/lti/courses/1146163/tool_consumer_profile/339b6700-e4cb-47c5-a54f-3ee0064921a9#ToolProxyBindingSettings', 
         '@type': 'RestService', 
         'action': ['GET', 'PUT'], 
         'endpoint': 'https://canvas.instructure.com/api/lti/tool_settings/bindings/{binding_id}', 
         'format': ["application/vnd.ims.lti.v2.toolsettings+json'", 
           'application/vnd.ims.lti.v2.toolsettings.simple+json']}, 
        {'@id': 'https://canvas.instructure.com/api/lti/courses/1146163/tool_consumer_profile/339b6700-e4cb-47c5-a54f-3ee0064921a9#LtiLinkSettings', 
         '@type': 'RestService', 
         'action': ['GET', 'PUT'], 
         'endpoint': 'https://canvas.instructure.com/api/lti/tool_settings/links/{tool_proxy_id}', 
         'format': ['application/vnd.ims.lti.v2.toolsettings+json', 
           'application/vnd.ims.lti.v2.toolsettings.simple+json']}]} 

,這裏是刀具代理我送回去(我試着拔出任何東西,似乎是可選的。)

POST https://canvas.instructure.com/api/lti/courses/1146163/tool_proxy 

{ 
    "@type": "ToolProxy", 
    "@context": "http://purl.imsglobal.org/ctx/lti/v2/ToolProxy", 
    "tool_proxy_guid": "339b6700-e4cb-47c5-a54f-3ee0064921a9", 
    "tool_consumer_profile": "https://canvas.instructure.com/api/lti/courses/1146163/tool_consumer_profile", 
    "tool_profile": { 
     "base_url_choice": [ 
      { 
       "default_base_url": "http://localhost:9090/", 
       "secure_base_url": "http://localhost:9090/", 
       "selector": { 
        "applies_to": [ 
         "IconEndpoint", 
         "MessageHandler" 
        ] 
       } 
      } 
     ], 
     "lti_version": "LTI-2p0", 
     "product_instance": { 
      "guid": "1431963455", 
      "service_owner": { 
"service_owner_name": { 
        "key": "service_owner.name", 
        "default_value": "EHR Tutor" 
       }, 
       "description": { 
        "key": "service_owner.description", 
        "default_value": "Provider of high quality education" 
       }, 
       "timestamp": "2017-05-04T05:37:35-05:00" 
      }, 
      "product_info": { 
       "product_name": { 
structure.com/api/lti/courses/1146163/tool_proxy/339b6700-e4cb-47c5-a54f-3ee0064921a9"\n}' 
        "key": "tool.name", 
        "default_value": "EHR Tutor" 
       }, 
       "description": { 
        "key": "tool.description", 
        "default_value": "EHR Tutor" 
       }, 
       "product_family": { 
        "vendor": { 
         "description": { 
          "key": "tool.vendor.description", 
          "default_value": "Noggin LLC" 
         }, 
         "contact": { 
          "email": "[email protected]" 
         }, 
         "code": "ehrtutor.com", 
         "timestamp": "2017-05-04T05:37:35-05:00", 
         "website": "https://www.ehrtutor.com", 
         "vendor_name": { 
          "key": "tool.vendor.name", 
          "default_value": "Noggin LLC" 
         } 
        }, 
        "code": "assessment-tool", 
        "@id": "https://my.ehrtutor.com" 
       }, 
       "product_version": "0.0.1b", 
       "technical_description": { 
        "key": "tool.technical", 
        "default_value": "Support provided for LTI 2" 
       } 
      }, 
      "support": { 
       "email": "[email protected]" 
      }, 
      "service_provider": { 
       "description": { 
        "key": "service_provider.description", 
        "default_value": "Service Host Provider" 
       }, 
       "guid": "1431963455", 
       "support": { 
        "email": "[email protected]" 
       }, 
       "service_provider_name": { 
        "key": "service_provider.name", 
        "default_value": "EHR Tutor" 
       }, 
       "timestamp": "2017-05-04T05:37:35-05:00" 
      } 
     }, 
     "resource_handler": [ 
      { 
       "resource_name": { 
        "key": "lesson.resource.name", 
        "default_value": "EHR Tutor App Launcher" 
       }, 
       "description": { 
        "key": "lesson.resource.description", 
        "default_value": "Launch the EHR Tutor Application" 
       }, 
       "message": [ 
        { 
         "message_type": "basic-lti-launch-request", 
         "path": "lti", 
         "parameter": [ 
          { 
           "variable": "User.id", 
           "name": "user_id" 
          }, 
          { 
           "variable": "Person.name.given", 
           "name": "lis_person_name_given" 
          }, 
          { 
           "variable": "Person.name.family", 
           "name": "lis_person_name_family" 
          }, 
          { 
           "variable": "Person.name.full", 
           "name": "lis_person_name_full" 
          }, 
          { 
           "variable": "Person.email.primary", 
           "name": "lis_person_contact_email_primary" 
          }, 
          { 
           "variable": "Membership.role", 
           "name": "roles" 
          }, 
          { 
           "variable": "Context.id", 
           "name": "context_id" 
          }, 
          { 
           "variable": "Context.title", 
           "name": "context_title" 
          }, 
          { 
           "variable": "ResourceLink.title", 
           "name": "resource_link_title" 
          }, 
          { 
           "variable": "CourseSection.sourcedId", 
           "name": "lis_course_section_sourcedid" 
          } 
         ] 
        } 
       ], 
       "resource_type": { 
        "code": "lesson" 
       } 
      } 
     ] 
    }, 
    "lti_version": "LTI-2p0", 
    "security_contract": { 
     "shared_secret": "lgvupYnu5kaCFMWzLZkWhoKPbRaF89oyPGbTzaTwiYFpe3_c4xdQ2B-CW4-pAQeedzXxKf8h0J-T2O5tjxzFFA==" 
    }, 
    "@id": "https://canvas.instructure.com/api/lti/courses/1146163/tool_proxy/339b6700-e4cb-47c5-a54f-3ee0064921a9" 
} 
+0

從工具使用者到目前爲止,從最初的註冊信息中看到整個註冊流程是很有用的。以及工具消費者配置文件json。我猜這不是你的簽名是錯誤的,雖然你獲得400和500回來,而不是401或403 – Nathan

+0

取得了一些進展,但仍然沒有在大多數地方工作。對於我發送的內容類型有問題。它沒有放入oauth_body_hash並且在安全性字詞中出現拼寫錯誤。修復後,Moodle 3.3開始工作和ltiapps。仍然無法獲得Moodle 3.2或Canvas的工作。 –

回答

1

在最後有很多問題需要注意,當您嘗試在LTI 2.0中註冊toolproxy時需要注意。

  1. Make su再次,你的內容類型是 application/vnd.ims.lti.v2.toolproxy+json
  2. 請確保您在您的授權有oauth_body_hash
  3. 檢查所有JSON鍵的拼寫和大小寫
  4. 請確保你問任何參數您的資源 處理程序位於tool_consumer_profile的capability_offered列表中。使用reg_key而不是tool_conxymer_profile中的guid作爲tool_proxy_guid/oauth_consumer_key。 guid與Moodle上的reg_key相同,但guid在Canvas中是一個常量值。

如果您在使用Python並且需要使用請求,oauthlib的oauth_body_hash您可以添加force_include_body=True到您好!OAuth1調用讓它發生。

sign = OAuth1(self.launch_params['reg_key'], self.launch_params['reg_password'], 
         signature_type=SIGNATURE_TYPE_AUTH_HEADER, force_include_body=True)