Basicamente, vc precisa adicionar alguns cabeçalhos especificos.
Antes daquele seu if
, adicione isto:
$method = $_SERVER['REQUEST_METHOD'];
$origin = $_SERVER['HTTP_ORIGIN'];
if ($method === 'OPTIONS') {
$requestMethod = $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'];
$requestHeaders = $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'];
header("Access-Control-Allow-Methods: $requestMethod");
header("Access-Control-Allow-Headers: $requestHeaders");
}
header("Access-Control-Allow-Origin: $origin");
header('Access-Control-Allow-Credentials: true');
// ...
Antes de alguns tipos de requisições o navegador faz uma requisição extra com o método OPTIONS chamada de pre-flight request.
Na pre-flight request ele espera que o servidor responda quais métodos e quais cabeçalhos ele permite. O cabeçalho "Access-Control-Allow-Headers' é importante porque seu cliente pode querer enviar cabeçalhos diferentes e vc precisa permiti-los.
O cabeçalho 'Access-Control-Allow-Origin' deve estar presente em qualquer requisição. Seu valor pode ser '*' indicando que qualquer origin é permitida, mas o asterisco é inválido quando vc está usando 'Access-Control-Allow-Credentials: true', por isso temos que usar a origin exata do cliente.
O cabeçalho 'Access-Control-Allow-Credentials: true' é importante, pois permite que o cliente envie cookies junto com a requisição.
Não tenho certeza se isso cobre todos os casos de uso, mas acredito que é um bom começo para o que vc precisa. Para entender melhor o protocolo CORS, recomendo a especificação: https://fetch.spec.whatwg.org/#http-cors-protocol