#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
метод вызова ajaxmodel.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.