首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Backbone.js + jsOAuth

Backbone.js + jsOAuth
EN

Stack Overflow用户
提问于 2011-10-14 06:38:32
回答 4查看 4.8K关注 0票数 6

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

我是否应该重写sync method以包含标头?

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2012-10-23 23:59:54

我不需要使用jsOAuth就能做到这一点。我覆盖了模型的sync方法以进行jquery ajax调用,并在这些调用上设置了beforeSend属性以在请求上创建一个oauth头。然后,在模型上设置了适当的属性(特别是正文和url )之后,您需要做的所有PUT/POST操作就是modelInstance.save(),并且模型会处理oauth本身。

下面的示例是用coffeescript编写的。

模型示例:

代码语言:javascript
复制
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`函数:

代码语言:javascript
复制
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.

  • keyurlsecretrealm被传递到这个模型的初始化方法,所以可以在我已经展示的代码中访问,above.

  • model.body是一个你必须自己设置的属性。它不是主干标准的attribute.

  • If我的例子看起来有点离谱,因为我在这里展示的模型实际上是我专门为oauth通信编写的模型。然后我让我的包含数据的模型扩展了这个模型。例如,这就是为什么ajax调用的success方法调用model.success()。如果这个模型是一次性的,ajax调用的success方法实际上会在那里执行成功的工作。
票数 4
EN

Stack Overflow用户

发布于 2011-11-24 17:10:39

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

jsOAuth 1.x不能很容易地插入到jQuery中,因此也不能作为主干。然而,自我在Twitter上回答以来,已经取得了一些进展。

正在开发中的jsOAuth 2.0实现了一个类似XHR的接口,因此您可以像这样使用它:

代码语言:javascript
复制
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对象。

票数 3
EN

Stack Overflow用户

发布于 2012-04-02 15:22:07

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7761249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档