使用数组参数签署 OAuth 请求

Signing an OAuth request with an array parameter

我在签署 URL 参数中包含数组的 OAuth 请求时遇到问题。 这是我要签名的 URL 的示例:

http://example.com/oauth1/products?filter[categorie]=myCategorie&page=1

我正在使用 OAuthSignatureJS 生成签名,它在传递简单参数时工作得很好,但在添加数组时 returns 一个 无效签名 回复。 我尝试使用 JSON 而不是 url 但还是一样,我无法更改 API 服务器代码。

这是调用函数(AngularJS)

var request = generateRequest('GET', 'products', page, 'myCategorie');
request = request+'&page='+page+'&filter[categorie]=myCategorie';
$http.get(request, {timeout: config.timeout})
.success(function(json, status, headers, config){
})
.error(function(error){
    console.log(error);
}) 

这是我用来生成请求的函数

var generateRequest = function(method, route, page = null, categorie = null) {
    var timestamp = Math.floor(new Date().getTime()/1000);
    var nonce = generateNonce();
    var parameters = {
        oauth_consumer_key: api.key,
        oauth_nonce: nonce,
        oauth_timestamp: timestamp,
        oauth_signature_method: api.signature,
        oauth_version: api.version
    };

    if(page) parameters.page = page;

    if(categorie) {
        parameters.filter = [];
        parameters.filter['categorie'] = categorie;
        console.log(parameters);
    }

    var link = 'http://example.com/oauth1/' + route;

    // Generating the signature with OauthSignatureJS
    var signature = oauthSignature.generate(method, link, parameters, api.secret);
    var authentification = '?oauth_consumer_key='+api.key+'&oauth_signature_method='+api.signature+'&oauth_version='+api.version+'&oauth_timestamp='+timestamp+'&oauth_nonce='+nonce+'&oauth_signature='+signature;

    return link+authentification;
}

在 URL 中传递过滤器 [categorie] 参数时,服务器响应 401 未授权消息。

Invalid Signature - provided signature does not match

我的代码有问题还是 OauthSignature JS 库?

提前致谢。

我找到了答案,我只需要将过滤器数组作为字符串添加到参数对象 parameters['filter[categorie]'] = categorie;

所以这是新的工作代码

var generateRequest = function(method, route, page = null, categorie = null) {
    var timestamp = Math.floor(new Date().getTime()/1000);
    var nonce = generateNonce();
    var parameters = {
        oauth_consumer_key: api.key,
        oauth_nonce: nonce,
        oauth_timestamp: timestamp,
        oauth_signature_method: api.signature,
        oauth_version: api.version
    };

    if(page) parameters.page = page;

    if(categorie) parameters['filter[categorie]'] = categorie; 

    var link = 'http://example.com/oauth1/' + route;

    // Generating the signature with OauthSignatureJS
    var signature = oauthSignature.generate(method, link, parameters, api.secret);
    var authentification = '?oauth_consumer_key='+api.key+'&oauth_signature_method='+api.signature+'&oauth_version='+api.version+'&oauth_timestamp='+timestamp+'&oauth_nonce='+nonce+'&oauth_signature='+signature;

    return link+authentification;
}