Resultados anômalos da API

Olá!

Estou tentando fazer uma chamada à API para criar um novo tópico. Discourse API Docs

Usando o Postman, estou enviando a Chave da API, o Nome de Usuário e o Content-Type nos cabeçalhos, e os dados JSON no corpo.

Já verifiquei que o Nome de Usuário e a Chave da API estão corretos, mas a chamada à API retorna o HTML da nossa página de login.

Isso é esperado? Como posso contornar isso?

Você pode colar a versão cURL da chamada de API que está tentando fazer?

Claro…

curl -X POST 'https://staging-discuss.newrelic.com/posts.json' \
     -H 'Api-Username: RyanVeitch' -i \
     -H 'Api-Key: My-API-Key' -i \
     -H 'Content-Type: application/json' \
     -d \
'{
    "title": "Meu título elegante",
    "raw": "Algum texto aleatório para preencher meu tópico",
    "category": 212,
    "created_at": "2020-06-22"
}'

No terminal, recebo esta saída:

HTTP/1.1 307 Redirecionamento Temporário
Proxied-By: Service Gateway
Strict-Transport-Security: max-age=31536000; includeSubDomains
Location: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json
content-type: text/plain;charset=UTF-8
content-length: 138

Redirecionando para um URI diferente: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json%

Me avise se precisar de mais alguma coisa da minha parte para ajudar na solução de problemas :smiley:

Parece que você tem uma configuração muito personalizada com um proxy no meio.

Isso não é um comportamento padrão do Discourse, então parece que isso é causado pelo seu proxy especial.

Talvez haja um cabeçalho especial que você possa enviar para contornar o proxy? É preciso verificar a documentação desse produto.

Legal! Obrigado @Falco - Vou me aprofundar com nossa equipe de desenvolvimento :slight_smile:

Ei @Falco - consegui passar pelo proxy, mas agora estou recebendo erros 403 BAD CSRF.

Vejo que esse tópico parece meio inacabado…

Você tem alguma ideia de como contornar esses erros?

Acabei de testar o comando curl do exemplo localmente e funcionou perfeitamente para mim, então a sintaxe está correta. É possível que o proxy esteja removendo alguns cabeçalhos? Isso poderia explicar os erros de CSRF inválidos, pois ele não consegue mais ler/acessar as credenciais da API.

Obrigado, @blake

Nosso proxy é totalmente personalizado e desenvolvido internamente, atuando como uma camada frontal para o público.

Estou conectado via VPN à nossa rede interna e não estou acessando a URL pública, mas sim a URL do backend (atrás do proxy). Portanto, as requisições não deveriam estar passando pelo proxy.

Nossa instância de staging do Discourse está na versão 2.3.10.

O comportamento da API é diferente nessa versão?

Não, a v2.3.10 ainda possui todo o sistema de autenticação baseado em cabeçalhos, então não deve se comportar de forma diferente.

Você está atingindo esta linha:

o que significa que sua solicitação está malformada de alguma forma e o sistema não consegue detectar que se trata de uma solicitação de API.

Como esta é uma instância de staging e não local, você terá o nginx ou algum outro servidor web rodando antes de chegar ao Discourse. É possível que o nginx esteja removendo alguns cabeçalhos, dependendo da sua configuração. Eles podem aparecer nos logs do nginx.

Esta é a linha onde as credenciais da API são lidas a partir dos cabeçalhos da solicitação. Você também pode adicionar algumas instruções de debug a este arquivo para verificar se os cabeçalhos estão chegando até aqui.

@blake

Obrigado! Vou levar isso à nossa equipe de desenvolvimento :smiley:

Agradeço sua ajuda