Я смог сделать это без использования 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 фактически выполнил бы успешную работу прямо здесь.