Cabeçalhos CORS da API incorretos

Hi,

I am having an issue with embedding discourse in our intranet site.

The API documentation states the discourse request requires the headers “API-Key” and “Api-Username” to authenticate and gain access to the feed. However the Pre-flight check says that “User-API-Key”, “User-Api-Client-Id” are the allowed values.

When called not through a browser this work as expected. But when calling through the browser the server is claiming it requires “User-API-Key”, “User-Api-Client-Id”.

I checked basic connection worked with PostMan this behaves as per the discourse docs

If we pass the Headers from the Docs the browser blocks the request due to Pre-flight check and gets a Access-Control-Allow-Headers CORS error.

If we pass the headers the server will accept we get a “not authorised error” because the application expects differently named values.

I have tried adding headers to the docker config but it doesn’t seem to apply. The CORS enabled and origin of ‘*’ is in the config.

Can anyone advise?

Thanks,
Jessica

Just wondering if there was any more info on the above? Is this a bug or something I’m doing wrong?

Thanks,
Jessica

We have two different API authentication systems, which can be confusing.

These are for the ‘admin API’, which is described on docs.discourse.org. This is not designed to be used from javascript clients.

These are from the “User API” specification, which can be used from a javascript client (and therefore supports CORS). There are more details about this here: 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: