【发布时间】:2015-08-06 10:20:18
【问题描述】:
我正在尝试对 Last.fm 会话进行身份验证,并且正在努力正确签署会话密钥请求。
我一直收到Invalid method signature supplied 但是,当我对我认为查询应该包含在 JS 之外的内容进行 md5 哈希处理时,我得到了相同的签名。我猜我必须在字符串中包含错误的数据,但不知道是什么。
我知道还有一些其他问题,我已经将它们全部浏览了一遍,看看这里出了什么问题,但我发誓这对我来说是正确的。
这是签名算法和 Ajax 调用。我也试着留下足够的样本数据。
// Set elsewhere but hacked into this example:
var last_fm_data = {
'last_token':'TOKEN876234876',
'user': 'bob',
'secret': 'SECRET348264386'
};
// Kick it off.
last_fm_call('auth.getSession', {'token': last_fm_data['last_token']});
// Low level API call, purely builds a POSTable object and calls it.
function last_fm_call(method, data){
// param data - dictionary.
last_fm_data[method] = false;
// Somewhere to put the result after callback.
// Append some static variables
data['api_key'] = "APIKEY1323454";
data['format'] = 'json';
data['method'] = method;
post_data = last_fm_sign(data);
$.ajax({
type: "post",
url: last_url,
data: post_data,
success: function(res){
last_fm_data[method] = res;
console.log(res['key'])// Should return session key.
},
dataType: 'json'
});
}
function last_fm_sign(params){
ss = "";
st = [];
so = {};
Object.keys(params).forEach(function(key){
st.push(key); // Get list of object keys
});
st.sort(); // Alphabetise it
st.forEach(function(std){
ss = ss + std + params[std]; // build string
so[std] = params[std]; // return object in exact same order JIC
});
// console.log(ss + last_fm_data['secret']);
// api_keyAPIKEY1323454formatjsonmethodauth.getSessiontokenTOKEN876234876SECRET348264386
hashed_sec = unescape(encodeURIComponent($.md5(ss + last_fm_data['secret'])));
so['signature'] = hashed_sec; // Correct when calculated elsewhere.
return so; // Returns signed POSTable object
}
任何人都可以看到我在这里失踪了吗?我非常困惑为什么这没有以请求的here 格式返回正确签名的 POSTable 对象。谢谢你的时间。
编辑:如果我没有得到任何建议,我无法感谢任何人的时间!没有人使用过 last.fm 吗?
【问题讨论】:
-
尝试删除
data['format'] = 'json'; -
谢谢,我会试试这个以及下面的答案。
-
干杯,虽然有点偏离 - 我在下面用我发现的关于格式属性的内容编辑了我自己的答案。
标签: javascript jquery api md5 last.fm