Texto e documentos
Números e cálculo
Dados e formatos
Segurança
Desenvolvimento e DevOps
Inteligência Artificial
Finanças
Saúde & Bem-estar
Produtividade
Jogos & Entretenimento
Multimédia e design
Empresa
Guia de utilização
O que é e para que serve

O CORS (Cross-Origin Resource Sharing) é o mecanismo pelo qual um navegador decide se um site pode ler a resposta de uma API alojada noutra origem (outro domínio, porta ou protocolo). Sem os headers CORS corretos, o navegador bloqueia a leitura por segurança. Esta ferramenta simula essa verificação do navegador: explica-te, sem fazer nenhum pedido real e tudo no teu navegador, se o teu servidor permitiria a chamada e porquê.

O que introduzir

Preenche três coisas:

• Origem (navegador) — o URL da app que faz o pedido (p. ex. https://myapp.com). É o valor que o navegador enviaria no header Origin.
• Método HTTP — GET, POST, PUT, DELETE… O método decide se é preciso um preflight.
• Headers de resposta do servidor — cola os headers que a tua API devolve, um por linha, no formato Nome: valor (p. ex. Access-Control-Allow-Origin: *). A análise atualiza-se sozinha enquanto escreves.

Pedido simples vs preflight

Há duas formas de pedido cross-origin:

• Pedido simples — com GET, POST ou HEAD e cabeçalhos básicos, o navegador envia-o diretamente e depois verifica se a resposta traz Access-Control-Allow-Origin.
• Com preflight — com métodos como PUT, PATCH ou DELETE (ou cabeçalhos personalizados), o navegador envia antes um pedido prévio do tipo OPTIONS para pedir permissão. A ferramenta assinala automaticamente quando o seu método requer preflight.

O preflight (OPTIONS) em detalhe

O preflight é um pedido OPTIONS que o navegador envia antes do real para perguntar «deixas-me fazer isto?». Nesta ferramenta é disparado com os métodos PUT, PATCH, DELETE e OPTIONS. Quando aparece o aviso, o teu servidor tem de responder a esse OPTIONS com os headers CORS adequados (origem, métodos e headers permitidos); caso contrário, o navegador cancela o pedido real mesmo que a tua API funcione. Adicionar Access-Control-Max-Age evita repetir o preflight em cada chamada.

Access-Control-Allow-Origin

É o cabeçalho imprescindível: indica que origem pode ler a resposta.

• * — permite qualquer origem, mas não funciona com credenciais (cookies).
• Uma origem concreta, p. ex. https://myapp.com — só essa origem, e tem de coincidir exatamente com a sua Origem (protocolo + domínio + porta).

Se faltar este cabeçalho, ou o valor não coincidir com * nem com a sua origem, o pedido é bloqueado.

Access-Control-Allow-Methods

Lista os métodos HTTP que o servidor aceita de outra origem, separados por vírgulas (p. ex. GET, POST, PUT, DELETE). É relevante sobretudo no preflight. Se indicar este cabeçalho mas não incluir o seu método, a ferramenta assinala-o como problema e bloqueia o pedido. Se não o colocar, o método não é verificado.

Access-Control-Allow-Headers

Enumera que cabeçalhos de pedido o cliente pode enviar (p. ex. Content-Type, Authorization). O navegador exige-o no preflight quando o seu pedido envia cabeçalhos não padrão. Se a sua app enviar Authorization e aqui não aparecer, o navegador bloqueará a chamada.

Access-Control-Allow-Credentials

Com valor true permite enviar cookies e credenciais no pedido cross-origin.

• Atenção, gotcha importante: as credenciais são incompatíveis com Access-Control-Allow-Origin: *. Se usar credenciais, a origem tem de ser específica (p. ex. https://myapp.com), nunca *. Combinar ambos faz com que o navegador rejeite a resposta.

Access-Control-Max-Age e Vary

Access-Control-Max-Age indica quantos segundos o navegador pode guardar em cache a resposta do preflight (p. ex. 86400 = 24 h), para não repetir o OPTIONS em cada chamada. A ferramenta inclui-o nos headers sugeridos quando o seu método precisa de preflight. Lembre-se ainda de adicionar Vary: Origin no seu servidor quando devolver uma origem concreta, para que as caches não misturem respostas de origens diferentes.

Como ler o resultado

Depois da análise verás:

• Um banner verde (permitido) ou vermelho (bloqueado) com o motivo exato: falta Access-Control-Allow-Origin, a origem não coincide ou o método não está permitido.
• Headers CORS encontrados — cada header detetado com o seu valor e uma explicação.
• Problemas detetados — o que impede o pedido.
• Funciona, mas é um risco de segurança — o que o navegador efetivamente deixa passar e não devias querer, como admitir a origem null com credenciais.
• O teu navegador permite-o, mas não confies — o que o Chrome aceita hoje e a especificação não garante.
• Headers sugeridos — um bloco pronto a copiar para a configuração do teu servidor.

CORS ExplainerAnalisa os headers CORS do teu servidor
Explicador de CORSAnalisa e explica os headers CORS do teu servidor
URL da app que faz o pedido

Marca isto se o teu código usar <code>credentials: 'include'</code> (ou <code>withCredentials</code>). Muda as regras: a origem já não pode ser <code>*</code>, os wildcards deixam de valer e o servidor tem de responder <code>Access-Control-Allow-Credentials: true</code>.

Os do PEDIDO, não os da resposta. São os que decidem se o navegador envia antes um OPTIONS, e os que «Access-Control-Allow-Headers» tem de cobrir.

CORS permitido correctamente
O navegador vai enviar antes um pedido OPTIONS (preflight), por o Content-Type application/json. O teu servidor também tem de responder a ESSE OPTIONS, não só ao pedido real.

Headers CORS encontrados

Access-Control-Allow-Originhttps://myapp.comPermite solo el origen: https://myapp.com
Access-Control-Allow-MethodsPOSTMétodos permitidos: POST
Access-Control-Allow-HeadersContent-TypeCabeceras permitidas en la petición: Content-Type

Headers sugeridos para o teu servidor

Access-Control-Allow-Origin: https://myapp.com
Vary: Origin
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Content-Type
Access-Control-Max-Age: 86400
Isto decide-se sobre os cabeçalhos que colares, sem sair para a rede — por isso também serve para uma API local ou privada. Se quiseres lançar o pedido A SÉRIO e ver se o teu servidor chegou a responder, está o Banco de trabalho de APIs.