Ryan_NR
(Ryan)
22. Juni 2020 um 15:26
1
Hallo!
Ich versuche, einen API-Aufruf zu tätigen, um ein neues Thema zu erstellen. Discourse API Docs
Mit Postman sende ich den API-Schlüssel, den Benutzernamen und den Content-Type als Header sowie JSON-Daten im Body.
Ich habe überprüft, dass der API-Benutzername und der Schlüssel korrekt sind, aber die API-Antwort enthält das HTML unserer Anmeldeseite.
Ist das zu erwarten? Wie kann ich das umgehen?
Falco
(Falco)
22. Juni 2020 um 16:35
2
Könntest du bitte die cURL-Version des API-Aufrufs, den du auszuführen versuchst, einfügen?
Ryan_NR
(Ryan)
23. Juni 2020 um 07:05
3
Okay…
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": "Mein ausgefallener Titel",
"raw": "Einiger zufälliger Text, um mein Thema zu füllen",
"category": 212,
"created_at": "2020-06-22"
}'
Im Terminal erhalte ich folgende Ausgabe:
HTTP/1.1 307 Temporary Redirect
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
Umleitung zu einer anderen URI: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json%
Ryan_NR
(Ryan)
23. Juni 2020 um 15:36
4
Lass mich wissen, falls du von meiner Seite aus noch etwas brauchst, um bei der Fehlerbehebung zu helfen
Falco
(Falco)
23. Juni 2020 um 17:16
5
Es scheint, als hättest du eine sehr individuelle Konfiguration mit einem Proxy dazwischen.
Das ist kein Standardverhalten von Discourse, daher sieht es so aus, als ob dies durch deinen speziellen Proxy verursacht wird.
Vielleicht kannst du einen speziellen Header senden, um den Proxy zu umgehen? Das müsstest du in der Dokumentation dieses Produkts prüfen.
Ryan_NR
(Ryan)
24. Juni 2020 um 06:45
6
Cool! Danke @Falco – ich werde mich mit unserem Entwicklerteam daran machen
Ryan_NR
(Ryan)
25. Juni 2020 um 09:31
7
Hey @Falco – ich habe den Proxy erfolgreich durchlaufen, bekomme aber jetzt 403 BAD CSRF-Fehler.
Ich sehe, dass dieser Thread irgendwie unvollständig wirkt…
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"…
Hast du eine Idee, wie man diese Fehler umgehen kann?
blake
(Blake Erickson)
25. Juni 2020 um 15:37
8
Ich habe Ihren Beispiel-curl-Befehl gerade lokal getestet, und er funktioniert bei mir einwandfrei, sodass die Syntax vollständig korrekt ist. Ist es möglich, dass der Proxy einige Header entfernt? Das könnte der Grund für die BAD CSRF-Fehler sein, da die API-Anmeldedaten dann nicht mehr gelesen/zugriffen werden können.
Ryan_NR
(Ryan)
25. Juni 2020 um 15:51
9
Danke, @blake
Unser Proxy ist eine vollständig eigene, intern entwickelte Lösung und fungiert als erste Schicht für das öffentliche Netzwerk.
Ich bin über ein VPN in unser internes Netzwerk eingebunden und greife nicht auf die öffentliche URL zu, sondern direkt auf die Backend-URL (hinter dem Proxy). Daher sollten die Anfragen nicht über den Proxy laufen.
Unsere Staging-Discourse-Instanz hat die Version 2.3.10.
Verhält sich die API in dieser Version anders?
blake
(Blake Erickson)
25. Juni 2020 um 16:09
10
Nein, v2.3.10 enthält immer noch die gesamte Header-basierte Authentifizierung, also sollte es sich nicht anders verhalten.
Sie treffen auf diese Zeile:
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
Das bedeutet, dass Ihre Anfrage in irgendeiner Weise fehlerhaft ist und nicht erkannt werden kann, dass es sich um eine API-Anfrage handelt.
blake
(Blake Erickson)
25. Juni 2020 um 16:25
11
Da dies eine Staging-Instanz und nicht lokal ist, läuft vor der Anfrage an Discourse entweder nginx oder ein anderer Webserver. Möglicherweise entfernt nginx je nach Konfiguration bestimmte Header. Diese könnten in den nginx-Protokollen erscheinen.
Dies ist die Zeile, in der die API-Anmeldedaten aus den Anfrage-Headern gelesen werden. Sie könnten auch einige Debug-Anweisungen in diese Datei einfügen, um herauszufinden, ob die Header diesen Punkt erreichen.
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)
25. Juni 2020 um 17:07
12
@blake
Danke! Ich werde das mit unserem Entwicklungsteam besprechen
Danke für deine Hilfe