33
votes

Comment puis-je activer CORS à Fastapi?

J'essaie d'activer les COR dans cet exemple de Fastapi très basique, mais cela ne semble pas fonctionner.

curl -v http://127.0.0.1:8000
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8000 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8000
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Fri, 08 Jan 2021 19:27:37 GMT
< server: uvicorn
< content-length: 26
< content-type: application/json
<
* Connection #0 to host 127.0.0.1 left intact
{"message":"Hello World!"}*


15 commentaires

Cela semble fonctionner. Vous autorisez les demandes de toutes les origines


@Isabi je ne reçois pas Access-Control-Allow-Origin: * dans ma réponse.


Avez-vous essayé avec un navigateur ou une application? Je suppose que Curl n'envoie pas le Origin dans les en-têtes car il n'a pas d'origine bien définie, il ne peut donc pas le retourner dans les en-têtes


J'ai essayé avec Chrome et Postman. Les seuls en-têtes que j'obtiens dans la réponse sont: Content-Length , Content-Type , Date et Server .


C'est étrange. Avez-vous essayé avec l'exemple complet? fastapi.tiangolo.com/tutorial/cors/?h=+ CORS # use-corsmiddlewa‌ re


J'ai essayé cela aussi. Je ne sais pas ce qui se passe malheureusement ...


J'ai testé l'exemple de code des documents officiels et il ne montre pas les COR lorsqu'on lui demande le terminal, mais il les montre de JavaScript exécutant dans le navigateur (Chromium version 87.0.4280.88 (build officiel) SNAP (64 bits ) )


Si CORS est effectivement activé, l'en-tête Access-Control-Allow-Origin: * ne doit-il pas être envoyé avec la réponse?


Si c'est dans le navigateur dans lequel les autorisations CORS sont obligatoires oui, mais dans le cas d'une API, les demandes de différentes sources / domaines seront effectuées, alors non. CORS sont principalement pour des raisons de sécurité (scripts qui effectuent des demandes de ressources externes)


@lsabi de quelle utilisation ce COR est-il s'il ne peut pas se restreindre à tout moment? me ressemble à une fonctionnalité inutile car elle peut être contournée assez facilement et ne fonctionne pas, aussi si derrière le serveur Web Proxy ... ne fonctionnera pas, sauf si le proxy est configuré pour utiliser CORS aussi


@uberrebu Je ne comprends pas votre question. L'objectif de COR est de prendre en charge l'accès direct de JavaScript aux API tiers


ou pour restreindre et autoriser uniquement à certaines origines / domaines ... oui ou non?


@lsabi oui ou non? CORS veut contrôler l'accès au point de terminaison en fonction de l'origine / du domaine? Oui ou non?


@uberrebu no, CORS est pour restreindre l'accès au même domaine. Je veux être le seul à accéder à mon API à partir du navigateur, donc je n'autorise que mon domaine comme origine (bien que les appels API directs, et non via le navigateur, soient autorisés). Cela garantit plus de sécurité pour mes utilisateurs qui naviguent via le navigateur


Vous avez dit non et ensuite d'accord avec ce que je dis, contre-t'en contredisant ... vous venez de dire pour restreindre l'accès ... Donc, si ces COR peuvent être contournés, alors la sécurité de l'illusion de la sécurité?


3 Réponses :


47
votes

5 commentaires

Ne pas travailler pour moi a même redémarré le serveur


@Sunilgarg Cela ne devrait pas fonctionner. Sur le lien donné par Yuanzz fastapi.tiangolo.com/tutorial/ CORS /… , il dit littéralement "les permis ne peuvent pas être définis sur ['*'] pour que les informations d'identification soient autorisées"


Vous ne pouvez pas utiliser [*] comme des origines autorisées tandis que_Credentials est définie sur true


Citation littérale à partir de la page d'aide: "De plus, les pertes ne peuvent pas être définies sur [*] pour que les informations d'identification soient autorisées, les origines doivent être spécifiées."


Cette solution est excellente



5
votes

CORS ou "Le partage de ressources croisées" fait référence aux situations lorsqu'un frontend exécuté dans un navigateur a un code JavaScript qui communique avec un backend, et le backend est dans une "origine" différente de celle du frontend.

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "http://domainname.com",
    "https://domainname.com",
    "http://localhost",
    "http://localhost:8080",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

en savoir plus


0 commentaires

2
votes

Dans mon cas, COR ne fonctionne pas lorsque les problèmes pydantes ou types se sont produits.

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "http://localhost:3000",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# works well!
@app.get("/list")
async def main():
    return ["hi", "hello"]

# error cases
from typing import List
from app.nosql.model import Book

@app.get("/error")
async def main():
    # case 1
    ret = mongo_db.engine.find(Book, limit=10) # keyword "await" missing
    return ret  # CORS 500 error
    # case 2
    ret: List[Book] = await mongo_db.engine.find(Book, limit=10) # data was not fit with model Book
    return ret # CORS error
    # case 3
    return ["hi", "hello"] # works well...

Que dit l'erreur côté serveur? Il peut s'agir d'une erreur sur le serveur. Que diriez-vous de tester avec une nouvelle fonction. (n'a pas d'erreur) Si le serveur fonctionne bien .. Humm .. Sry à ce sujet.


0 commentaires