53 votes

ajouter un en-tête de demande sur le backbone

Mon serveur a une autorisation manuelle. Je dois ajouter le nom d'utilisateur et le mot de passe de mon serveur à ma demande de backbone pour qu'elle soit acceptée. Comment puis-je faire cela ? Avez-vous une idée ? Je vous remercie.

56voto

shanewwarren Points 1109

Dans Backbone, les modèles récupèrent, mettent à jour et détruisent les données à l'aide des méthodes suivantes fetch , save y destroy . Ces méthodes délèguent la partie demande réelle à Backbone.sync. Sous le capot, toutes les méthodes Backbone.sync est de créer une requête ajax en utilisant jQuery. Afin d'incorporer votre authentification HTTP de base, vous avez plusieurs options.

fetch , save y destroy acceptent tous un paramètre supplémentaire [options] . Ces [options] sont simplement un dictionnaire d'options de requête jQuery qui sont incluses dans l'appel ajax jQuery qui est effectué. Cela signifie que vous pouvez facilement définir une méthode simple qui ajoute l'authentification :

sendAuthentication = function (xhr) {
  var user = "myusername";// your actual username
  var pass = "mypassword";// your actual password
  var token = user.concat(":", pass);
  xhr.setRequestHeader('Authorization', ("Basic ".concat(btoa(token))));
}

Et l'inclure dans chaque fetch , save y destroy l'appel que vous faites. Comme ça :

 fetch({
  beforeSend: sendAuthentication 
 });

Cela peut créer un certain nombre de répétitions. Une autre option pourrait être de remplacer l'option Backbone.sync copiez le code original et incluez simplement la méthode beforeSend dans chaque requête ajax jQuery qui est effectuée.

J'espère que cela vous aidera !

0 votes

J'ai essayé votre code. mais il n'y a pas de réponse. il n'appelle pas le service.

0 votes

Pas de réponse du tout ? Ou bien vous recevez un code de réponse 401 ?

1 votes

De toute façon, pouvez-vous me donner un exemple de code sur la façon de remplacer le backbone.sync par des en-têtes ?

43voto

frank blizzard Points 3973

La manière la plus simple d'ajouter un en-tête de requête dans Backbone.js est de les passer à la méthode de récupération en tant que paramètres, par exemple.

MyCollection.fetch( { headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );

0 votes

Cela a marché pour moi, étonnamment ! Et ce n'est pas dans les docs au moment où je tape juste si quelqu'un se demandait. Une façon extrêmement simple de le gérer ;) étonnant. >Merci !

1 votes

Cela fonctionne sauf si le nom d'utilisateur a un :, vous devriez vraiment encoder base64 nom d'utilisateur:mot de passe

30voto

Andy Polhill Points 291

Une option pourrait être d'utiliser le jQuery ajaxSetup, toutes les requêtes Backbone utiliseront finalement le jQuery ajax sous-jacent. L'avantage de cette approche est que vous ne devez l'ajouter qu'à un seul endroit.

$.ajaxSetup({
    headers: { 'Authorization' :'Basic USERNAME:PASSWORD' }
});

Modifier le 2 janvier 2018 Pour les applications web complexes, ce n'est peut-être pas la meilleure approche, voir les commentaires ci-dessous. Je laisse la réponse ici à titre de référence.

1 votes

Même si ça a l'air de pouvoir marcher, n'utilisez pas ceci pour les raisons que j'ai décrites dans une autre réponse .

1 votes

Je serais enclin à être d'accord, ma réponse est assez vieille maintenant. La seule chose que je dirais est que si vous travaillez sur une expérience simple avec une seule source de données, ce serait un moyen rapide de commencer. Je pourrais donc la laisser ici à titre de référence.

18voto

zzart Points 2162

Vous pouvez remplacer la méthode de synchronisation de Backbone.

#coffeescript
_sync = Backbone.sync
Backbone.sync = (method, model, options) ->
    options.beforeSend = (xhr) ->
        xhr.setRequestHeader('X-Auth-Token_or_other_header' , your_hash_key)
        #make sure your server accepts X-Auth-Token_or_other_header!!
    #calling the original sync function so we only overriding what we need
    _sync.call( this, method, model, options )

4voto

Object.save(
  {'used': true}
  {headers: {'Access-Token': 'access_token'}}
)

0 votes

C'est la même réponse que le fetch exemple ci-dessus mais sans aucune explication.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X