Moodle LTI 2工具代理注册失败,错误为400或500

Moodle LTI 2工具代理注册失败,错误为400或500,moodle,canvas-lms,lti,Moodle,Canvas Lms,Lti,我正在用Python开发一个LTI工具提供程序,在LTI 1.x基本启动或内容项规范的任何方面都没有问题。尽管我试图使用LTI 2注册机制,但我遇到了一个巨大的难题 每当我在一些工具使用者上运行代码时,当我将工具代理发布到工具使用者配置文件中列出的工具代理端点时,我得到的只是一个400错误 我试过这个: (成功注册) Moodle 3.2在AWS上运行(400错误请求) 本地主机上的Moodle 3.3 runnong(成功注册) 画布(400错误请求){“错误”:“无效功能”} 不幸的是,

我正在用Python开发一个LTI工具提供程序,在LTI 1.x基本启动或内容项规范的任何方面都没有问题。尽管我试图使用LTI 2注册机制,但我遇到了一个巨大的难题

每当我在一些工具使用者上运行代码时,当我将工具代理发布到工具使用者配置文件中列出的工具代理端点时,我得到的只是一个400错误

我试过这个:

  • (成功注册)
  • Moodle 3.2在AWS上运行(400错误请求)
  • 本地主机上的Moodle 3.3 runnong(成功注册)
  • 画布(400错误请求){“错误”:“无效功能”}
不幸的是,我对这个请求的坏处一无所知。我90%确定它是JSON或是标题中的什么东西。我很确定它不是oAuth(感谢下面的评论以及它在4个测试环境中的2个环境中工作的事实)

据说Moodle在某个地方给了您一些输出,但我到处都找了,没有找到。我从SiteAdministrator菜单中打开了开发模式,并遵循了几个说明,以确保在PHP中记录错误,并且我在任何地方都找不到任何东西

起初,我在任何地方都无法实现这一点,但我能够将xdebug连接到本地Moodle 3.3实例,这就是我最终能够实现这一点的原因

以下是Canvas中的工具消费者配置文件:

    {'@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']}]}
这是我要发回的工具代理(我试图拉出任何看起来是可选的东西)


最后,在尝试在LTI 2.0中注册toolproxy时,有许多问题需要注意

  • 确保您的内容类型为
    application/vnd.ims.lti.v2.toolproxy+json
  • 确保您的授权中有一个
    oauth\u body\u hash
    标题
  • 检查所有JSON键的拼写和大小写
  • 确保您在资源中要求的任何参数 处理程序位于工具消费者配置文件的功能列表中
  • 使用reg_键而不是工具消费者配置文件中的guid作为工具代理消费者guid/oauth消费者密钥。guid与Moodle上的注册表项相同,但guid在画布中是一个常量值
  • 如果您使用的是Python,并且需要使用请求oauthlib的oauth\u body\u散列,那么您可以向OAuth1调用添加
    force\u include\u body=True
    ,以实现此操作

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

    从工具使用者发送给您的初始注册消息到现在,查看整个注册流程将非常有用。以及工具使用者配置文件json。我想这并不是因为你签了400和500,而不是401或403取得了一些进展,但在大多数地方仍然不起作用。我发送的内容类型有问题。它没有放入oauth_body_散列,并且在单词security中有一个拼写错误。修复后,Moodle 3.3开始工作并启动应用程序。仍然无法使用Moodle 3.2或Canvas。
    sign = OAuth1(self.launch_params['reg_key'], self.launch_params['reg_password'],
                          signature_type=SIGNATURE_TYPE_AUTH_HEADER, force_include_body=True)