J'essaie d'envoyer la demande d'un port localhost à un autre. J'utilise angularjs sur le frontend et noeud sur le backend.
Comme il s'agit de CORS demande, dans node.js, j'utilise
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
et dans le fichier de service angular.js, j'utilise
return {
getValues: $resource(endpoint + '/admin/getvalues', null, {
'get': {
method: 'GET',
headers:{'Authorization':'Bearer'+' '+ $localStorage.token}
}
}),
}
Je reçois l'erreur suivante
L'autorisation du champ d'en-tête de demande n'est pas autorisée par Access-Control-Allow-Headers dans la réponse de contrôle en amont.
S'il vous plaît aider!
Vous devez également ajouter des options dans les en-têtes autorisés. Le navigateur envoie une demande de contrôle en amont avant que la demande initiale soit envoyée. Voir ci-dessous
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
De la source https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS
Dans CORS, une demande de contrôle en amont avec la méthode OPTIONS est envoyée afin que le serveur puisse déterminer s’il est acceptable d’envoyer la demande avec ces paramètres. L'en-tête
Access-Control-Request-Method
informe le serveur dans le cadre d'une demande de contrôle en amont que, lorsque la demande réelle est envoyée, il est envoyé avec une méthode de demande POST. L'en-têteAccess-Control-Request-Headers
indique au serveur que, lorsque la demande est envoyée, elle sera envoyée avec les en-têtes personnalisésX-PINGOTHER
etContent-Type
. Le serveur a maintenant la possibilité de déterminer s'il souhaite accepter une demande dans ces circonstances.
ÉDITÉ
Vous pouvez éviter cette configuration manuelle en utilisant npmjs.com/package/cors package npm.J'ai utilisé cette méthode également, elle est claire et simple.
Il s'agit d'un problème d'API. Vous n'obtiendrez pas cette erreur si vous utilisez Postman/Fielder pour envoyer des requêtes HTTP à l'API. Dans le cas des navigateurs, pour des raisons de sécurité, ils envoient toujours une requête/preflight OPTIONS à l'API avant d'envoyer les requêtes réelles (GET/POST/PUT/DELETE). Par conséquent, dans le cas où la méthode de requête est OPTION, vous devez non seulement ajouter "Autorisation" dans "Accès-Contrôle-Autoriser-en-têtes", mais également "OPTIONS" dans "Accès-Contrôle-autoriser-méthodes". bien. Voici comment j'ai corrigé:
if (context.Request.Method == "OPTIONS")
{
context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { (string)context.Request.Headers["Origin"] });
context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept, Authorization" });
context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" });
context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });
}
La res.header('Access-Control-Allow-Origin', '*');
ne fonctionnerait pas avec l'en-tête Authorization. Activez simplement la demande de pré-vol, en utilisant bibliothèque cors :
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
app.options('*', cors())
Pour tous ceux qui l'obtiennent en utilisant le backend ServiceStack; Ajouter "Autorisation" aux en-têtes autorisés dans le plugin Cors :
Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type,Authorization"));
D'abord vous devez installercors
en utilisant la commande ci-dessous:
npm install cors --save
Maintenant ajoutez le code suivant dans le fichier de démarrage de votre application tel que (app.js or server.js
)
var express = require('express');
var app = express();
var cors = require('cors');
var bodyParser = require('body-parser');
//enables cors
app.use(cors({
'allowedHeaders': ['sessionId', 'Content-Type'],
'exposedHeaders': ['sessionId'],
'Origin': '*',
'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
'preflightContinue': false
}));
require('./router/index')(app);
Si vous ne souhaitez pas installer la bibliothèque cors et que vous souhaitez plutôt corriger votre code d'origine, il vous manque également l'étape suivante: Access-Control-Allow-Origin: * est incorrect. Lorsque vous transmettez des jetons d’authentification (par exemple, JWT), vous devez indiquer explicitement toutes les URL appelant votre serveur. Vous ne pouvez pas utiliser "*" lorsque vous utilisez des jetons d'authentification.