5
votes

Problème CORS du point de terminaison Flask-sentinel / oauth / token

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 :


0
votes

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


1 commentaires

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.



0
votes

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.


1 commentaires

Merci pour votre réponse mais je ne peux pas faire quelque chose comme ça à Eve.



0
votes

J'ai trouvé comment résoudre ce problème mais je ne suis pas entièrement satisfait.

Voici les étapes que j'ai suivies:

  • J'ai forké le référentiel Flask Sentinel
  • J'ai installé Flas-CORS avec Pip
  • J'ai modifié le fichier flask_sentinel / flask_sentinel.py en important flask_cors
  • Avant cette ligne Je ' J'ai inséré ce morceau de code:
CORS(app, origins=['http://192.168.1.y:3000','https://192.168.1.y:3000'])
  • Je suis retourné à mon projet Eve et j'ai installé Flask-Sentinel via mon dépôt fourchu avec Pip au lieu de l'original


1 commentaires

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.