-1

I have a website that has the following setup:

  • the client is an angular 14 project
  • the server is a python app with strawberry for graphql
  • using nginx as web server
  • using asgi python script to run the app using daphne

I'm having cors related errors when I try to access graphql from the angular app

Access to XMLHttpRequest at 'https://URL/graphql' from origin 'https://URL' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.

in the nginx server i have listen 443 ssl http2; set with certificates from lets encrypt

I created an upstream setup for the python project:

upstream myproj-server {
  server 127.0.0.1:8001;
  }

created a location backend:

 location @backend {
    proxy_pass http://myproj-server; # <--- THIS DOES NOT HAVE A TRAILING '/'
    #proxy_set_header 'Access-Control-Allow-Origin' "*";
    #proxy_set_header 'Access-Control-Allow-Credentials' 'true';
    #proxy_set_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
    #proxy_set_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With';
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-NginX-Proxy true;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_cache_bypass $http_upgrade;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto $scheme;
}

and setup graphql location:

     location /graphql {
#           add_header 'Access-Control-Allow-Origin' "*" always;
#        add_header 'Access-Control-Allow-Credentials' 'true' always;
#        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
#        add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;

        try_files $uri $uri/ @backend;
    }

i commented out the CORS lines with # but i did try to enable them, to add cors at the /graphql location or at the proxy configured in the backend, both configurations did not change anything.

next, i have a server.py with the asgi application with the strawberry plugin for the graphql:

from strawberry.asgi import GraphQL

from app import schema

app = GraphQL(schema, graphiql=False)

and i start it with daphne -b 0.0.0.0 -p 8001 server:app

and here I tried to modify server.py to use the Starlette CORS middleware

from strawberry.asgi import GraphQL
from starlette.middleware.cors import CORSMiddleware
from starlette.middleware import Middleware
from starlette.applications import Starlette

from app import schema

middleware = [
    Middleware(CORSMiddleware, allow_origins=['*'],
    allow_methods=["*"],
    allow_credentials=True,
    allow_headers=["*"],)
]

graphql_app=GraphQL(schema, graphiql=True)

app = Starlette(middleware=middleware)
app.add_route("/graphql", graphql_app)
app.add_websocket_route("/graphql", graphql_app)

and also here the results are the same

I'm sure that the reverse proxy works properly because if i set graphiql to True and i browse mydomain/graphql it does open the graphql-playground.

so I tried anything i can think of and i'm pretty lots, so any ideas or any information regarding this issue would be greatly appreciated.

ufk
  • 30,912
  • 70
  • 235
  • 386
  • See https://stackoverflow.com/questions/42168773/how-to-resolve-preflight-is-invalid-redirect-or-redirect-is-not-allowed-for/42172732#42172732 – sideshowbarker Nov 06 '22 at 23:48

1 Answers1

-1

I checked the network tab of my browser and I noticed that what the OPTIONS request (for the CORS preflight request) fails with error 301, which is redirect. and then I noticed that the graphql url is mydomain.com/graphql and not www.mydomain.com/graphql and I do redirect to www in my nginx configuration.

i disabled the headers in the nginx i prefer to control it outside of the nginx configuration.

the server.py configuration with starlette did the trick. of course now i'll make it more secured.

ufk
  • 30,912
  • 70
  • 235
  • 386