我正在用Backbone.js构建一个移动应用程序,我需要做一个两条腿的OAuth来连接一个REST API。我找到了一个名为jsOAuth的库,但不确定如何将其与Backbone集成。
我是否应该重写sync method以包含标头?
任何帮助都将不胜感激。
发布于 2012-10-23 23:59:54
我不需要使用jsOAuth就能做到这一点。我覆盖了模型的sync方法以进行jquery ajax调用,并在这些调用上设置了beforeSend属性以在请求上创建一个oauth头。然后,在模型上设置了适当的属性(特别是正文和url )之后,您需要做的所有PUT/POST操作就是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模块是Netflix在2008年创建的模块,您可以找到here。如果它以某种方式被删除,您可能可以通过谷歌搜索javascript oauth "This isn't as useful as you might hope"找到该文件。这个问题听起来可能不像是对这个文件的认可,但我发现它不是真的:这个文件非常有用。
其他可能的绊脚石:
你的模型需要一个初始化函数,它返回发送请求的URL,to.
key,url,secret,realm被传递到这个模型的初始化方法,所以可以在我已经展示的代码中访问,above.
model.body是一个你必须自己设置的属性。它不是主干标准的attribute.
success方法调用model.success()。如果这个模型是一次性的,ajax调用的success方法实际上会在那里执行成功的工作。发布于 2011-11-24 17:10:39
我想我可能已经在Twitter上回答了这个问题。
jsOAuth 1.x不能很容易地插入到jQuery中,因此也不能作为主干。然而,自我在Twitter上回答以来,已经取得了一些进展。
正在开发中的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对象。
发布于 2012-04-02 15:22:07
为什么不尝试使用$.ajaxPrefilter (http://api.jquery.com/jQuery.ajaxPrefilter/)
您可以添加预过滤器,检查url是否适用于此oauth连接的作用域,如果是,则更改标头、添加授权标头或更改查询参数。
https://stackoverflow.com/questions/7761249
复制相似问题