我試圖在Desire2Learn中創建一個外部學習工具,按照https://d2l.nl.edu/shared/HelpFiles/10%20Administrator%20Help/learningenvironment/basic_lti_standards_support/org_level_lti_configuration.html和http://devs.valence.desire2learn.com/tag/lti的指示進行操作,甚至無法獲得示例測驗項目的工作。LTI集成問題與Desire2Learn
我試過了我能想到的所有事情,並且在某一點上我有它的工作,並且可以在Desire2Learn中正確加載我的學習工具,但它似乎剛剛停止,我無法再計算出來,因爲我花了5個小時試圖解決這個問題。我試圖通過回顯POST和本地變量來調試和拋出Desire2Learn中工具提供程序和鏈接字段內的URL字段中的不同內容。
我在這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_KEY靠在$ _POST [「oauth_consumer_key」]字段檢查,如果它們相等,則$ OAUTH_KEY和$ OAUTH_SECRET字段用於生成一個臨時簽名/令牌,然後通過$ _POST ['oauth_signature']字段進行驗證。
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;
}
這是我被阻止的地方。當返回語句返回時,或換句話說,$ parameters數組中的簽名值與$ signature不匹配時,會出現「無效的OAuth簽名」錯誤。根據我的理解,如果我在LMS中設置的'key'和'secret'字段與我在上面兩個變量中設置的那些字段相同,就不會發生這種情況。
「我試圖做X,它不工作」不是一個有用的問題。 *什麼*不起作用,特別是?有錯誤消息嗎?你有什麼試圖解決它們?你寫了什麼代碼?我想幫忙,但我不能。 – Alex
對不起,解釋起來有點複雜。我編輯了我的問題,以提供從Desire2Learn發送到我的學習工具的初始POST數據,幷包含一些我必須進行身份驗證的OAUTH變量。一切似乎很好,除了oauth_signature字段給我的問題。 – hRdCoder
要弄清楚這裏發生了什麼,仍然是非常困難的。 'CaclulateSignatureForFormUrlEncoded'的前提條件是什麼?是否支持「CheckSignatureForFormUrlEncoded」的前提條件?有沒有來自某個地方,或者你是否在自己的? – Alex