Backbone.js + jsOAuth - PullRequest
       27

Backbone.js + jsOAuth

6 голосов
/ 14 октября 2011

Я создаю мобильное приложение с Backbone.js, и мне нужно сделать OAuth на двух ножках, чтобы соединиться с REST API. Я нашел библиотеку с именем jsOAuth , но не уверен, как интегрировать ее с Backbone.

Должен ли я переписать метод синхронизации , чтобы включить заголовки?

Любая помощь будет оценена.

Ответы [ 4 ]

4 голосов
/ 23 октября 2012

Я смог сделать это без использования jsOAuth.Я переопределил метод sync моей модели для выполнения вызовов jquery ajax и установил атрибут beforeSend для этих вызовов, чтобы создать заголовок oauth для запроса.Затем, после установки соответствующих атрибутов в модели (в частности, body и 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, созданный в 2008 году Netflix. здесь .В случае, если это каким-то образом сбито, вы, вероятно, сможете найти файл, набрав googling javascript oauth "This isn't as useful as you might hope".Возможно, этот запрос не звучит как одобрение файла, но я нашел его неверным: файл очень полезен.

Другие возможные камни преткновения:

  • Ваша модельдля этого потребуется функция url, которая возвращает URL-адрес для отправки запроса.
  • key, secret и realm передаются методу инициализации этой модели и т. д.доступны в коде, который я показал выше.
  • model.body - это атрибут, который вы должны установить самостоятельно.Это не стандартный атрибут магистрали.
  • Если мой пример выглядит немного не так, то это потому, что модель, которую я здесь показал, на самом деле является той, которую я написал исключительно для осуществления oauth-общения.Затем у меня были модели, которые на самом деле содержали данные, расширяют эту модель.Вот почему, например, метод success вызова ajax вызывает model.success().Если бы эта модель была одноразовой, метод success вызова ajax фактически выполнил бы успешную работу прямо здесь.
3 голосов
/ 24 ноября 2011

Я думаю, что, возможно, я ответил на этот вопрос в Твиттере.

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;
};

Как видите, помещается непосредственно в jQuery как объект XHR , который он использует.

2 голосов
/ 02 апреля 2012

Почему бы вам не попробовать с $ .ajaxPrefilter (http://api.jquery.com/jQuery.ajaxPrefilter/)

Вы можете добавить префильтр, проверить, соответствует ли URL-адрес области действия данного oauth-соединения, и если это так, изменить заголовки, добавить заголовок авторизации или изменить параметры запроса.

1 голос
/ 11 января 2013

Возможно, вы захотите взглянуть на этот OAuth 2.0 плагин для Backbone .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...