我想在我的网络应用程序中包含一些OpenEdx课程。为此,我决定使用OpenEDX支持的LTI协议(作为上一版本中的消费者和提供者)。
作为LTI消费者,我的应用程序已经成功整合了moodle LTI提供商系统的一些内容。
当我尝试使用相同的代码时,一切正常,直到我通过post发送所有参数,openEDX将我的错误400回复给我的帖子请求。
为了进行测试,我正在使用fullstack安装(Dogwood版本),我根据以下内容修改了一点以启用LTI提供程序的功能:http://edx.readthedocs.org/projects/edx-installing-configuring-and-running/en/latest/configuration/lti/enable_lti.html
然后我按照文档在管理界面中配置LTI提供程序,并从官方文档中创建另一个页面来构建我的LTI调用URL,如下所示: http://192.168.33.10/lti_provider/courses/course-v1:edX+DemoX+Demo_Course/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0270f6de40fc
在我的帖子请求中,我发送以下参数:
我已经验证,所有这些参数都已正确发送。
你知道错误的来源吗?
非常感谢!
[编辑:]我终于找到了麻烦的地方。我想念一些参数,这些参数仅在OpenEDX案例中强制推荐给LTI bu。 如果它错过了mandorty参数,则打开edx会返回错误400。
在/lms/djangoapps/lti_provider/views.py上:
REQUIRED_PARAMETERS = [
'roles', 'context_id', 'oauth_version', 'oauth_consumer_key',
'oauth_signature', 'oauth_signature_method', 'oauth_timestamp',
'oauth_nonce', 'user_id'
]
""" code which return error 400
params = get_required_parameters(request.POST)
if not params:
return HttpResponseBadRequest()
def get_required_parameters(dictionary, additional_params=None):
"""
Extract all required LTI parameters from a dictionary and verify that none
are missing.
:param dictionary: The dictionary that should contain all required parameters
:param additional_params: Any expected parameters, beyond those required for
the LTI launch.
:return: A new dictionary containing all the required parameters from the
original dictionary and additional parameters, or None if any expected
parameters are missing.
"""
params = {}
additional_params = additional_params or []
for key in REQUIRED_PARAMETERS + additional_params:
if key not in dictionary:
return None
params[key] = dictionary[key]
return params
答案 0 :(得分:0)
实际上,您在进行POST时必须在LTI Consumer工具中指定必需的参数
REQUIRED_PARAMETERS = [
'user_id',
'roles',
'context_id',
'oauth_version',
'oauth_consumer_key',
'oauth_signature',
'oauth_signature_method',
'oauth_timestamp',
'oauth_nonce'
]