我正在使用Backbone.js构建移动应用程序,我需要做一个双腿OAuth来连接REST API。我找到了一个名为jsOAuth的库,但不确定如何将它与Backbone集成。
我应该重写sync method以包含标题吗?
任何帮助将不胜感激。
答案 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: (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。key
,secret
和realm
会传入此模型的initialize方法,因此可以在我上面显示的代码中访问。model.body
是您必须自行设置的属性。它不是骨干标准属性。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。