Backbone.js jsOAuth

#javascript #rest #mobile #backbone.js #oauth

#javascript #отдых #Мобильный #backbone.js #oauth

Вопрос:

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

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

Буду признателен за любую помощь.

Комментарии:

1. oauth на стороне клиента предоставит ваши ключи / секреты. Я настоятельно рекомендую делать запросы на сервере, если вы можете.

Ответ №1:

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

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

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

Комментарии:

1. не нравится публикация в CoffeeScript

Ответ №2:

Я думаю, что, возможно, я ответил на этот вопрос в 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;
};
  

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

Ответ №3:

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

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

Ответ №4:

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

Комментарии:

1. Эта версия была прекращена и теперь указывает на пару других библиотек, включая jsOAuth.