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

时间:2017-05-05 18:14:10

标签: moodle canvas-lms lti

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

每当我在一些工具消费者上运行我的代码时,当我将工具代理发布到工具消费者资料中列出的工具代理端点时,我得到的是400错误。

我试过这个:

  • http://lti.tools/test/tc.php(成功登记)
  • 在AWS上运行的Moodle 3.2(400 Bad Request)
  • Moodle 3.3在Localhost上运行(登记成功)
  • 画布(400错误请求){"错误":"无效功能"}

不幸的是,没有什么能让我知道这个请求有什么不好。我90%肯定它是JSON或标题中的东西。我很确定它不是oAuth(感谢下面的评论以及它在4​​个测试环境中的2个中工作的事实)

据说Moodle在某个地方为你提供了一些输出,但是我到处寻找并且找不到它。我从“站点管理员”菜单中打开了开发模式,并按照几个指示来确定如何在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']}]}

这是我发回的工具代理(我试图提取任何似乎是可选的。)

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": "info@ehrtutor.com"
                        },
                        "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": "support@ehrtutor.com"
            },
            "service_provider": {
                "description": {
                    "key": "service_provider.description",
                    "default_value": "Service Host Provider"
                },
                "guid": "1431963455",
                "support": {
                    "email": "support@ehrtutor.com"
                },
                "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"
}

1 个答案:

答案 0 :(得分:1)

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

  1. 确保您的内容类型为 application/vnd.ims.lti.v2.toolproxy+json
  2. 确保您的授权中有oauth_body_hash
  3. 检查所有JSON密钥的拼写和大小写
  4. 确保您在资源中要求的所有参数 处理程序位于tool_consumer_profile
  5. 的capability_offered列表中
  6. 使用reg_key而不是tool_consumer_profile中的guid作为tool_proxy_guid / oauth_consumer_key。 guid与Moodle上的reg_key相同,但guid在Canvas中是一个常量值。
  7. 如果您使用的是Python并且需要使用requests-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)
    
相关问题