CORS Swagger

0

Mam mały problem mam API w PHP (to najmniej ważne) i dokumentacje w swagger/openapi, jednak w edytorze nie działa odpytywanie endpointów poza jednym logowaniem.

w konsoli dostaje:

editor.swagger.io/:1 Access to fetch at 'https://adres.pl/api/user/profile' from origin 'https://editor.swagger.io' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

Poczytałem i dodałem nagłówki w htaccess i są one zwracane przez serwer:

access-control-allow-origin *
access-control-allow-headers *
access-control-allow-methods *
access-control-allow-credentials true

Ale to nie pomogło.

jedyne obejście jakie znalazłem to uruchomienie chrome z wyłączeniem zabezpieczeń:

C:\Program Files\Google\Chrome\Application>chrome.exe --disable-web-security --user-data-dir="c:/ChromeDevSession"

Ale to chyba nie o to chodzi.

Ktoś coś podpowie?

UPDATE:

Co ciekawe jak nie przekazuje nagłówka z JWT Authorization: Bearer JWT to wtedy swagger działa

0
Panczo napisał(a):

Mam mały problem mam API w PHP (to najmniej ważne) i dokumentacje w swagger/openapi, jednak w edytorze nie działa odpytywanie endpointów poza jednym logowaniem.

w konsoli dostaje:

editor.swagger.io/:1 Access to fetch at 'https://adres.pl/api/user/profile' from origin 'https://editor.swagger.io' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

Poczytałem i dodałem nagłówki w htaccess i są one zwracane przez serwer:

access-control-allow-origin *
access-control-allow-headers *
access-control-allow-methods *
access-control-allow-credentials true

Ale to nie pomogło.

jedyne obejście jakie znalazłem to uruchomienie chrome z wyłączeniem zabezpieczeń:

C:\Program Files\Google\Chrome\Application>chrome.exe --disable-web-security --user-data-dir="c:/ChromeDevSession"

Ale to chyba nie o to chodzi.

Ktoś coś podpowie?

A probowałeś odpytywać np Postmanem?

UPDATE:

Co ciekawe jak nie przekazuje nagłówka z JWT Authorization: Bearer JWT to wtedy swagger działa

A co znaczy, że działa? Zwraca dane pomimo nie podania JWT?

0

A probowałeś odpytywać np Postmanem?

Nie, tu nie ma problemu z samym API (chyba). Napisałem sobie testy w Thunder Client i one przechodzą dobrze. Problem pojawia się w tym, że to było API, które muszę dać ludziom na zewnątrz i ogarniam testowe środowisko. Postanowienie jest aby dokumentacja była openapi, żeby ładnie to w swagger edytować i testować. No piszę tego yaml-a tylko przeglądarka wali błędem przy odpytywaniu.

Co ciekawe, logowanie gdzie dane są wysyłane post działa, cała reszta get nie, dając w consoli błąd z pierwszego postu.

A co znaczy, że działa? Zwraca dane pomimo nie podania JWT?

Nie, zwraca 401

Czyli:

curl -X 'GET' \
  'https://adres.pl//api/user/profile' 
  -H 'accept: application/json' 
  -H 'Authorization: Bearer eyJ0e(...)mnBDkQtDA'

zwraca

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
Cache-Control: public, max-age=1800
Expires: Tue, 17 Aug 2021 08:12:50 GMT
Content-Length: 257
Content-Encoding: gzip
Vary: Accept-Encoding,User-Agent
Date: Tue, 17 Aug 2021 07:42:50 GMT
Server: LiteSpeed
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Credentials: true
Alt-Svc: quic=":443"; ma=2592000; v="43,46", h3-Q043=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-25=":443"; ma=2592000, h3-27=":443"; ma=2592000

{json}

a:

curl -X 'GET' \
  'https://adres.pl//api/user/profile' 
  -H 'accept: application/json' 

zwraca

HTTP/1.1 401 Unauthorized
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Cache-Control: public, max-age=1800
Expires: Tue, 17 Aug 2021 08:22:16 GMT
Content-Length: 19
Date: Tue, 17 Aug 2021 07:52:16 GMT
Server: LiteSpeed
Vary: User-Agent
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Credentials: true
Alt-Svc: quic=":443"; ma=2592000; v="43,46", h3-Q043=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-25=":443"; ma=2592000, h3-27=":443"; ma=2592000

Unauthorized client

Jest gdzieś jakiś niuas, ale nie mam pojęcia gdzie szukać, na stronie http://www.test-cors.org/ analogicznie 401 "działa" z headerem Authorization nie.

0

Kilka rzeczy się dowiedziałem o CORS

Jeżeli wysyłamy nagłówek access-control-allow-credentials true to wtedy, Access-Control-Allow-Origin nie może być *,.

Zatem zmieniłem nagłówki na:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
Header add Access-Control-Allow-Methods "GET, POST"
Header always set Access-Control-Max-Age "1000"

To jednak nie rozwiązało problemu. Wtedy dowiedziałem się o Preflight request, więc wystarczyło w kodzie PHP obsłuzyć metodę OPTIONS zwracając 204 i zaczęło działać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1