Je rencontre des problèmes en essayant d'obtenir un jeton de mon application flask-sentinel avec mon front-end.
Pour faire les requêtes AJAX de mon front-end à mon Serveur d'API Python Eve J'utilise le superagent a> module.
Lors de l'utilisation d'une authentification de base, je n'ai aucun problème à obtenir les données de mes terminaux. Voir le code ci-dessous:
SENTINEL_X_DOMAINS = ['http://192.168.1.y:3000'] SENTINEL_X_HEADERS = ['Authorization','Content-type','If-Match','Access-Control-Allow-Origin'] SENTINEL_X_EXPOSE_HEADERS = SENTINEL_X_HEADERS SENTINEL_RESOURCE_METHODS = ['GET','HEAD','PUT','PATCH','POST','DELETE','OPTIONS'] SENTINEL_PUBLIC_METHODS = SENTINEL_RESOURCE_METHODS SENTINEL_X_ALLOW_CREDENTIALS = True X_DOMAINS = ['http://192.168.1.y:3000'] X_ALLOW_CREDENTIALS = True X_HEADERS = ['Authorization','Content-type','If-Match','Access-Control-Allow-Origin'] RESOURCE_METHODS = ['GET','HEAD','PUT','PATCH','POST','DELETE','OPTIONS']
Si j'essaie de demander un jeton au point de terminaison / oauth / token
avec ce code:
Access to XMLHttpRequest at 'http://192.168.1.x:5000/oauth/token' from origin 'http://192.168.1.y:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
J'obtiens une erreur CORS:
superagent .post( 'http://192.168.1.x:5000/oauth/token' ) .set( 'Content-Type', 'application/x-www-form-urlencoded' ) .send( 'grant_type=password&client_id='+this.params.client_id+'&username='+this.params.username+'&password='+this.params.password ) .on( 'error', this.onError ) .then( this.onTokenReceived );
Voici les paramètres de mon application (en omettant les paramètres de la base de données et du domaine):
superagent .get( 'http://192.168.1.x:5000/endpoint' ) .auth( this.params.username, this.params.password ) .on( 'error', this.onError ) .then( this.onSuccess );
Pouvez-vous me guider pour comprendre ce que je fais mal?
Merci d'avance!
3 Réponses :
Il est possible que le type de contenu n'étant pas text / plain, le navigateur émette un OPTIONS . et comme indiqué dans l'erreur de console, la réponse ne définit pas le ' En-tête Access-Control-Allow-Origin .
En consultant la la documentation d'Eve , il semble que vous deviez définissez la variable X_EXPOSE_HEADERS avec ['Access-Control-Allow-Origin'] qui:
"Permet aux responsables de l'API de spécifier les en-têtes exposés dans un Réponse CORS. Les valeurs autorisées sont: Aucun ou une liste de noms d'en-têtes. La valeur par défaut est Aucun. "
Le navigateur s'attend à recevoir le 'Access-Control-Allow-Origin', donc l'échec. Essayez d'autoriser cet en-tête dans la réponse de l'API
Merci pour votre réponse, j'ai testé cette solution et malheureusement cela ne fonctionne pas. J'ai réussi à le faire fonctionner d'une autre manière. Je répondrai dès que j'aurai le temps.
Dans votre application Flask, essayez de définir l'en-tête "Access-Control-Allow-Origin" dans votre réponse, c'est-à-dire
response.headers.add('Access-Control-Allow-Origin', '*')
Cela devrait très probablement résoudre le problème.
Merci pour votre réponse mais je ne peux pas faire quelque chose comme ça à Eve.
J'ai trouvé comment résoudre ce problème mais je ne suis pas entièrement satisfait.
Voici les étapes que j'ai suivies:
flask_sentinel / flask_sentinel.py
en important flask_cors CORS(app, origins=['http://192.168.1.y:3000','https://192.168.1.y:3000'])
Au lieu de bifurquer et de modifier flask-sentinel
lui-même, vous pouvez importer le ResourceOwnerPasswordCredentials
, le sous-classer, et dans la méthode __init__
de votre sous-classe, vous pouvez faites l'initiation CORS
puis exécutez la méthode __init__
de la superclasse. Vous pouvez ensuite utiliser votre sous-classe au lieu de ResourceOwnerPasswordCredentials
directement.
peut être utile? developer.mozilla.org/en-US/docs/Web/ HTTP / CORS / Erreurs