Php 与Desire2Learn的LTI集成问题
我试图在Desire2Learn中创建一个外部学习工具,方法是按照和的说明进行操作,但我甚至无法让样例测验项目正常工作 我已经尝试了我能想到的一切,在某一点上,我让它工作,并可以在Desire2Learn中正确加载我的学习工具,但它似乎刚刚停止,我无法再找出它,因为我花了5个小时试图解决这个问题。我已经尝试过这样的事情,比如回显POST和局部变量以进行调试,并在工具提供程序内的URL字段和Desire2Learn中的链接字段中抛出不同的内容 在我花了5个小时的时间里,我注意到的是,在身份验证过程中重新创建签名时,它与POST数据中发送的[oauth_signature]字段从不匹配,尽管密钥和机密与LMS中的匹配 如果这是有意义的,我感谢任何和所有的帮助,我可以在这方面得到的,因为我已经花了太多的时间在这方面,不能再直接思考了。谢谢大家! 编辑: 下面是Desire2Learn发送回的上下文数据的print_r(),以及我正在验证的OAUTH参数,下面是我设置的局部变量Php 与Desire2Learn的LTI集成问题,php,lti,Php,Lti,我试图在Desire2Learn中创建一个外部学习工具,方法是按照和的说明进行操作,但我甚至无法让样例测验项目正常工作 我已经尝试了我能想到的一切,在某一点上,我让它工作,并可以在Desire2Learn中正确加载我的学习工具,但它似乎刚刚停止,我无法再找出它,因为我花了5个小时试图解决这个问题。我已经尝试过这样的事情,比如回显POST和局部变量以进行调试,并在工具提供程序内的URL字段和Desire2Learn中的链接字段中抛出不同的内容 在我花了5个小时的时间里,我注意到的是,在身份验证过程
[launch_presentation_locale] => EN-US__
[tool_consumer_instance_guid] => key
[tool_consumer_instance_name] => secret
[tool_consumer_instance_description] => Learning Tool.
[tool_consumer_instance_contact_email] =>
[tool_consumer_info_version] => 10.3.0 SP5
[tool_consumer_info_product_family_code] => desire2learn
[context_id] => 2440554
[context_title] => context
[context_label] => context
[context_type] =>
[user_id] => userid_88888
[roles] => None
[ext_tc_profile_url] => https://sampleprofileurl.com
[ext_d2l_token_id] => 386867949
[ext_d2l_link_id] => 9554
[ext_d2l_token_digest] => 2bv8al0f+NxuBWpBS36nl/RuNWg=
[resource_link_id] =>
[resource_link_title] => LinkTitle
[resource_link_description] => LinkDes.
[lis_result_sourcedid] => 808080-89989-234232
[lis_outcome_service_url] => https://outcomeurl.com
[lti_version] => LTI-1p0
[lti_message_type] => basic-lti-launch-request
[oauth_version] => 1.0
[oauth_nonce] => 784335425
[oauth_timestamp] => 1403634776
[oauth_signature_method] => HMAC-SHA1
[oauth_consumer_key] => key
[oauth_callback] => about:blank
[oauth_signature] => PYCJyQe3jSLTXn8vxet1eknSfoc=
[basiclti_submit] => Launch Endpoint with BasicLTI Data
$OAUTH_KEY = 'key';
$OAUTH_SECRET = 'secret';
$SITE_URL = 'https://sample.com';
当POST数据最初从Desire2Learn发回时,$OAUTH_密钥将根据$_POST['OAUTH_消费者_密钥']字段进行检查,如果它们相等,$OAUTH_密钥和$OAUTH_秘密字段将用于生成临时签名/令牌,然后根据$_POST['OAUTH_签名']字段对其进行身份验证
public static function CheckSignatureForFormUrlEncoded( $url, $httpMethod, $parameters, $secret) {
$oauthParameters = array();
$lmsParameters = array();
// Separate LMS and OAuth parameters
foreach( $parameters as $key => $value ) {
if( strpos( $key, self::OAUTH_PREFIX ) === 0 ) {
$oauthParameters[urldecode( $key )] = urldecode( $value );
continue;
}
$lmsParameters[urldecode( $key )] = urldecode( $value );
}
$signature = self::CalculateSignatureForFormUrlEncoded( $url, $httpMethod, $secret, $lmsParameters, $oauthParameters );
return $parameters[ self::SIGNATURE ] === $signature;
}
这就是我被阻止的地方。当return语句返回时,或者换句话说,$parameters数组中的签名值与$signature不匹配时,就会出现错误“Invalid OAuth signature”。据我所知,如果我在LMS中设置的“key”和“secret”字段与我在上面两个变量中设置的字段相等,则不应该发生这种情况。好的,我似乎已经找到了答案。听起来很愚蠢,我所要做的就是在Desire2Learn中我的外部学习工具链接的URL字段的末尾添加'index.php',以及工具提供者配置中的启动点字段。在我这样做之后,签名错误消失了,现在一切都好了。显然,工具使用者根本没有像我假设的那样专门寻找index.anywhere文件。“我尝试使用X,但它不起作用”不是一个有用的问题。具体来说,什么不起作用?是否有错误消息?你有没有试着修复它们?你写了什么代码?我想帮忙,但我就是帮不了。对不起,解释起来有点复杂。我编辑了我的问题,以提供从Desire2Learn发送到我的学习工具的初始POST数据,其中包括一些我必须验证的OAUTH变量。除了oauth_签名字段给我带来的问题之外,一切似乎都很好。现在仍然很难弄清楚这里发生了什么。
caclulatesignatureformurlencoded
的先决条件是什么?CheckSignatureForMurlencoded
的先决条件是否得到支持?这些是从什么地方来的还是你自己的?很抱歉这么晚才回复,但是CalculateSignatureForFormUrlEncoded()方法从传递给它的$parameters数组中删除未使用的变量,然后调用另一个名为CalculateSHA1Hash()的方法它接受字符串和“secret”字段作为可选参数,并使用HMAC_SHA1算法对字符串进行base64_编码。然后,将该字符串与从LMS传递到我的程序以执行身份验证的字符串进行比较。