Cabeçalhos CORS da API incorretos

Olá,

Estou tendo um problema ao incorporar o Discourse no nosso site de intranet.

A documentação da API afirma que a requisição ao Discourse exige os cabeçalhos “API-Key” e “Api-Username” para autenticar e acessar o feed. No entanto, a verificação pré-voo (pre-flight) indica que os valores permitidos são “User-API-Key” e “User-Api-Client-Id”.

Quando chamado fora de um navegador, tudo funciona como esperado. Mas, ao chamar através do navegador, o servidor afirma que exige “User-API-Key” e “User-Api-Client-Id”.

Verifiquei que a conexão básica funciona com o Postman, comportando-se conforme a documentação do Discourse.

Se passarmos os cabeçalhos conforme a documentação, o navegador bloqueia a requisição devido à verificação pré-voo e retorna um erro CORS (Access-Control-Allow-Headers).

Se passarmos os cabeçalhos que o servidor aceita, recebemos um erro de “não autorizado”, pois a aplicação espera valores com nomes diferentes.

Tentei adicionar cabeçalhos à configuração do Docker, mas parece não estar surtindo efeito. O CORS está habilitado e a origem está definida como ‘*’ na configuração.

Alguém pode nos orientar?

Obrigada,
Jessica

Só queria saber se há mais alguma informação sobre o assunto acima? Isso é um bug ou algo que estou fazendo de errado?

Obrigada,
Jessica

Temos dois sistemas diferentes de autenticação de API, o que pode causar confusão.

Estes são para a ‘API de administração’, descrita em docs.discourse.org. Ela não foi projetada para ser usada por clientes JavaScript.

Estes são da especificação da “API de Usuário”, que pode ser usada por um cliente JavaScript (e, portanto, suporta CORS). Há mais detalhes sobre isso aqui: User API keys specification

@david Estou usando SSO e quero fazer o logout do usuário no Discourse quando ele fizer logout do aplicativo. Atualmente, estou usando a ‘API de administrador’ para buscar o ID do usuário via /users/by-external/${id}.json, mas estou recebendo erros de CORS. Não quero habilitar a ‘API de usuário’ para todos os usuários apenas para esse processo de logout. O que você sugere?

O que está fazendo a solicitação à API de administrador? JavaScript na sua aplicação cliente?

Você não deve incluir uma API de administrador em um cliente JavaScript, pois isso significa que qualquer pessoa que use o cliente poderá obter acesso de administrador ao seu site.

Sim, é JavaScript no meu aplicativo. Entendo. Então, qual é a alternativa? Posso criar uma ‘API de usuário’ para um único usuário e usá-la para fazer a chamada para todos os usuários?

Se você usar a API de usuário, deve fazê-lo por usuário. Não compartilhe as chaves.

No entanto, o mais comum aqui seria lidar com isso no lado do servidor do seu aplicativo. Seu servidor pode enviar uma solicitação usando chaves de API de administrador sem problemas de CORS e com menos preocupações de segurança (desde que seja implementado com segurança).

Obrigado, @david. Isso é útil, vou resolver dessa forma. Obrigado novamente.

Oi @david, tentei implementar uma solução de backend, mas ao chamar https://example.com/users/by-external/{EXTERNAL_USER_ID}.json?api_key={DISCOURSE_API_KEY}&api_username=system, a resposta que recebo é o HTML da página de login (acho que está redirecionando para lá). Tenho a opção “login obrigatório” ativada e, quando a desativo, recebo a resposta JSON correta. Quero manter essa configuração ativada — alguma ideia do que está acontecendo?

Você precisa usar headers para a chave da API e o nome de usuário. Consulte http://docs.discourse.org/ para mais detalhes.

Isso resolveu, obrigado novamente. :+1: