web-dev-qa-db-fra.com

Plusieurs en-têtes d'autorisation HTTP?

Est-il possible d'inclure plusieurs en-têtes d'autorisation dans un message HTTP? Plus précisément, je voudrais inclure un type de jeton Bearer (en passant un OAuth jeton d'accès) et un de type Basic (en passant un nom d'utilisateur encodé en base64: mot de passe).

GET /presence/alice HTTP/1.1 
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM
Authorization: Basic YXNkZnNhZGZzYWRmOlZLdDVOMVhk

Je ne vois aucune raison pour laquelle cela ne devrait pas être possible, je voulais juste le vérifier avec la communauté pour en être sûr.

47
lewiada

Cela devrait être possible, il vous suffit d'ajouter une virgule entre les valeurs des champs, par exemple:

GET /presence/alice HTTP/1.1 
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM, Basic YXNkZnNhZGZzYWRmOlZLdDVOMVhk

Ceci est défini dans RFC72 , section 3.2.2, Ordre des champs:

Un expéditeur NE DOIT PAS générer plusieurs champs d'en-tête avec le même nom de champ dans un message, sauf si la valeur de champ entière pour ce champ d'en-tête est définie comme une liste séparée par des virgules [c'est-à-dire # (valeurs)] ou si le champ d'en-tête est un bien- exception connue (comme indiqué ci-dessous).

Un destinataire PEUT combiner plusieurs champs d'en-tête avec le même nom de champ en une paire "champ-nom: champ-valeur", sans changer la sémantique du message, en ajoutant chaque valeur de champ suivante à la valeur de champ combinée dans l'ordre, séparée par un virgule. L'ordre dans lequel les champs d'en-tête portant le même nom de champ sont reçus est donc important pour l'interprétation de la valeur de champ combinée; un proxy NE DOIT PAS changer l'ordre de ces valeurs de champ lors de la transmission d'un message.

Je ne sais pas si tous les serveurs Web acceptent cela - au moment d'écrire ces lignes, je suis au milieu d'un débat avec un collègue pour savoir si cela devrait fonctionner ou non.

35
Sam Critchley

Non, ce n'est pas possible. Voir la définition de la syntaxe dans http://greenbytes.de/tech/webdav/rfc7235.html#header.authorization

20
Julian Reschke

J'avais une question similaire. Cela semble être un problème assez courant ( Lien vers la question ). J'ai fini par changer l'en-tête d'autorisation pour le jeton du porteur en un en-tête non standard comme

X-Auth: porteur mF_9.B5f-4.1JqM

De cette façon, c'est juste un autre en-tête HTTP et l'autorisation http de base passera. Si vous développez votre propre API, cela ne devrait poser aucun problème.

Quelques recherches supplémentaires

Basé sur le RFC 2617 voici quelques détails intéressants.

L'agent utilisateur DOIT choisir d'utiliser l'un des défis avec le schéma d'authentification le plus puissant qu'il comprend et demander des informations d'identification à l'utilisateur en fonction de ce défi.

Notez que de nombreux navigateurs ne reconnaîtront que Basic et exigeront que ce soit le premier schéma d'authentification présenté. Les serveurs ne doivent inclure Basic que s'il est minimalement acceptable.

10
Azngeek

Il est possible d'avoir plusieurs en-têtes d'autorisation, j'ai rencontré le même problème lors de l'intégration de l'API qui accepte plusieurs autorisations.

Voici React js pour appeler une API qui accepte plusieurs jetons d'authentification.

axios.get(Constants.API+Constants.GET_USER,  {  headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
"Authorization": Constants.AUTH_Element + ',' + Constants.AUTH_ORG + ','+ 
Constants.AUTH_USER
}})
.then(function (response) {
    // handle success
    console.log(response);
})
.catch(function (error) {
    // handle error
    console.log(error);
})
.finally(function () {
    // always executed
});
0
Sravani