Ryan_NR
(Ryan)
Junho 22, 2020, 3:26pm
1
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?
Falco
(Falco)
Junho 22, 2020, 4:35pm
2
Você pode colar a versão cURL da chamada de API que está tentando fazer?
Ryan_NR
(Ryan)
Junho 23, 2020, 7:05am
3
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%
Ryan_NR
(Ryan)
Junho 23, 2020, 3:36pm
4
Me avise se precisar de mais alguma coisa da minha parte para ajudar na solução de problemas
Falco
(Falco)
Junho 23, 2020, 5:16pm
5
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.
Ryan_NR
(Ryan)
Junho 24, 2020, 6:45am
6
Legal! Obrigado @Falco - Vou me aprofundar com nossa equipe de desenvolvimento
Ryan_NR
(Ryan)
Junho 25, 2020, 9:31am
7
Ei @Falco - consegui passar pelo proxy, mas agora estou recebendo erros 403 BAD CSRF.
Vejo que esse tópico parece meio inacabado…
Can you share with me your actual ruby code to make this request? I’m unable to reproduce this locally. Here is the Postman json call I’m making and I’m always getting a response back:
[image]
[image]
Also I don’t think you need the extra post["raw"] parameter.
Parameters: {"title"=>"RT @love_se4: One of those hidden gems in the local community, you just have to try. Over 170 different gins. Proper mixologists who know h…", "raw"=>"https://twitter.com/se23_tweets/status/1127663613412630529"…
Você tem alguma ideia de como contornar esses erros?
blake
(Blake Erickson)
Junho 25, 2020, 3:37pm
8
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.
Ryan_NR
(Ryan)
Junho 25, 2020, 3:51pm
9
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?
blake
(Blake Erickson)
Junho 25, 2020, 4:09pm
10
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:
protect_from_forgery
# Default Rails 3.2 lets the request through with a blank session
# we are being more pedantic here and nulling session / current_user
# and then raising a CSRF exception
def handle_unverified_request
# NOTE: API key is secret, having it invalidates the need for a CSRF token
unless is_api? || is_user_api?
super
clear_current_user
render plain: "[\"BAD CSRF\"]", status: 403
end
end
before_action :check_readonly_mode
before_action :handle_theme
before_action :set_current_user_for_logs
before_action :clear_notifications
before_action :set_locale
before_action :set_mobile_view
before_action :block_if_readonly_mode
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.
blake
(Blake Erickson)
Junho 25, 2020, 4:25pm
11
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.
if uid
user = User.find_by(id: uid.to_i)
end
@env[CURRENT_USER_KEY] = user
return user
end
request = @request
user_api_key = @env[USER_API_KEY]
api_key = @env.blank? ? nil : @env[HEADER_API_KEY] || request[API_KEY]
auth_token = request.cookies[TOKEN_COOKIE] unless user_api_key || api_key
current_user = nil
if auth_token && auth_token.length == 32
limiter = RateLimiter.new(nil, "cookie_auth_#{request.ip}", COOKIE_ATTEMPTS_PER_MIN , 60)
if limiter.can_perform?
@user_token = UserAuthToken.lookup(auth_token,
Ryan_NR
(Ryan)
Junho 25, 2020, 5:07pm
12
@blake
Obrigado! Vou levar isso à nossa equipe de desenvolvimento
Agradeço sua ajuda