Backbone.js + jsOAuth

时间:2011-10-13 22:38:32

标签: javascript rest mobile backbone.js oauth

我正在使用Backbone.js构建移动应用程序,我需要做一个双腿OAuth来连接REST API。我找到了一个名为jsOAuth的库,但不确定如何将它与Backbone集成。

我应该重写sync method以包含标题吗?

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

我能够在不使用jsOAuth的情况下完成此操作。我重写了模型的sync方法以进行jquery ajax调用,并在这些调用上设置beforeSend属性以在请求上创建oauth标头。然后,在模型上设置适当的属性(具体为body和url)之后,你需要做的就是modelInstance.save(),模型会处理oauth本身。

以下示例均采用coffeescript。

模型样本:

Backbone.Model.extend

    sync: (method, model, options) ->

        switch method
            when "create"
                $.ajax({
                    url: model.url()
                    data: model.body
                    dataType: 'json'
                    cache: false
                    type: 'POST'
                    beforeSend: (xhr, settings) =>
                        auth = @makeAuthHeader(key, secret, settings.url, 'POST', realm)
                        xhr.setRequestHeader('Authorization', auth)
                        xhr.setRequestHeader('Content-Type', 'application/json')
                    success: (data, textStatus) ->
                        model.postSuccess(data, textStatus)
                    error: (e, jqxhr, exception) ->
                        model.postError(e, jqxhr, exception)
                })
            when "update"
                $.ajax({
                    url: model.url()
                    data: model.body
                    …

'makeAuthHeader`函数:

makeAuthHeader: (key, secret, encodedurl, method, realm) ->
    accessor = {consumerSecret: secret, tokenSecret: ""}
    message = {action: encodedurl, method: method, parameters: [["oauth_version", "1.0"],["oauth_consumer_key", key]]}
    OAuth.setTimestampAndNonce(message)
    OAuth.SignatureMethod.sign(message, accessor)
    return OAuth.getAuthorizationHeader(realm, message['parameters'])

我使用的oauth模块是2008年创建的Netflix,您可以找到here。如果以某种方式取消,您可以通过Google搜索javascript oauth "This isn't as useful as you might hope"找到该文件。该查询可能听起来并不像文件的认可,但我发现它是不真实的:该文件非常有用。

其他可能的绊脚石:

  • 您的模型需要一个url函数,该函数返回发送请求的URL。
  • keysecretrealm会传入此模型的initialize方法,因此可以在我上面显示的代码中访问。
  • model.body是您必须自行设置的属性。它不是骨干标准属性。
  • 如果我的例子看起来有些偏差,那是因为我在这里展示的模型实际上是我为了进行oauth沟通而编写的模型。然后我让我的模型实际包含数据扩展这个模型。这就是为什么,例如,ajax调用的success方法调用model.success()。如果这个模型是一次性的,那么ajax调用的success方法实际上会在那里执行成功工作。

答案 1 :(得分:3)

我想我可能已经在Twitter上回答了这个问题。

jsOAuth 1.x无法轻松插入jQuery,因此也是主干。但是,自从我在推特上回答以来,已经取得了一些进展。

在开发中,

jsOAuth 2.0实现了类似XHR的接口,以便您可以像这样使用它:

jQuery.ajaxSettings.xhr =  function () {
    var xhr =  new OAuthRequest;
    xhr.consumerKey = consumerKey;
    xhr.consumerSecret = consumerSecret;
    xhr.accessTokenKey = accessTokenKey;
    xhr.accessTokenSecret = accessTokenSecret;

    return xhr;
};

正如您所看到的,pushed directly into jQuery as the XHR它使用的对象。

答案 2 :(得分:2)

为什么不尝试使用$ .ajaxPrefilter(http://api.jquery.com/jQuery.ajaxPrefilter/)

您可以添加预过滤器,检查该url是否适用于此oauth连接的范围,如果是,则更改标头,添加授权标头或更改查询参数。

答案 3 :(得分:1)

您可能还想查看此OAuth 2.0 plugin for Backbone