Php 与Desire2Learn的LTI集成问题

Php 与Desire2Learn的LTI集成问题,php,lti,Php,Lti,我试图在Desire2Learn中创建一个外部学习工具,方法是按照和的说明进行操作,但我甚至无法让样例测验项目正常工作 我已经尝试了我能想到的一切,在某一点上,我让它工作,并可以在Desire2Learn中正确加载我的学习工具,但它似乎刚刚停止,我无法再找出它,因为我花了5个小时试图解决这个问题。我已经尝试过这样的事情,比如回显POST和局部变量以进行调试,并在工具提供程序内的URL字段和Desire2Learn中的链接字段中抛出不同的内容 在我花了5个小时的时间里,我注意到的是,在身份验证过程

我试图在Desire2Learn中创建一个外部学习工具,方法是按照和的说明进行操作,但我甚至无法让样例测验项目正常工作

我已经尝试了我能想到的一切,在某一点上,我让它工作,并可以在Desire2Learn中正确加载我的学习工具,但它似乎刚刚停止,我无法再找出它,因为我花了5个小时试图解决这个问题。我已经尝试过这样的事情,比如回显POST和局部变量以进行调试,并在工具提供程序内的URL字段和Desire2Learn中的链接字段中抛出不同的内容

在我花了5个小时的时间里,我注意到的是,在身份验证过程中重新创建签名时,它与POST数据中发送的[oauth_signature]字段从不匹配,尽管密钥和机密与LMS中的匹配

如果这是有意义的,我感谢任何和所有的帮助,我可以在这方面得到的,因为我已经花了太多的时间在这方面,不能再直接思考了。谢谢大家!

编辑:

下面是Desire2Learn发送回的上下文数据的print_r(),以及我正在验证的OAUTH参数,下面是我设置的局部变量

[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传递到我的程序以执行身份验证的字符串进行比较。