Ich habe meine Foren von 1.6 auf 3.1 aktualisiert, was die Migration auf einen neuen Server, die Wiederherstellung eines Backups und das erneute Zusammenfügen aller Komponenten beinhaltete.
Wir verwenden SSO für die Anmeldung bei beiden, was immer noch funktioniert.
Discourse scheint jedoch jetzt in einigen zufälligen Bereichen Fehler auszugeben, die ein Problem bei der Kontoerstellung von der Website über die API verursachen.
Wir haben das Ruby-Gem discourse_api in Version 0.10.1 verwendet, das ich auf 0.48.1 aktualisiert habe.
Der Fehler tritt bei DiscourseApiService.new.user(self)
auf, was resp = client.get(\"/users/by-external/#{user.id}\")
aufruft, was den Fehler {\"errors\"=>[\"Die angeforderte URL oder Ressource konnte nicht gefunden werden.\"], \"error_type\"=>\"not_found\"}
auslöst.
Dies hat früher einwandfrei funktioniert, aber aus irgendeinem Grund kann die URL jetzt nicht gefunden werden.
Ich habe versucht, das discourse_api-Gem wieder auf 0.10.1 herabzustufen, was wir zuvor verwendet haben. Es kommt über die client.get-Phase hinaus, schlägt aber stattdessen beim nächsten Aufruf mit demselben Fehler fehl:
client.sync_sso(
{\"errors\"=>[\"Die angeforderte URL oder Ressource konnte nicht gefunden werden.\"], \"error_type\"=>\"not_found\"}
Der Endpunkt wurde irgendwann zu /u/by-external/{external_id}.json geändert. Und für diesen Endpunkt sind ein API-Schlüssel und ein Benutzername erforderlich.
Anscheinend haben sie den Code aktualisiert, um tatsächlich einen Fehler auszulösen, wenn kein Benutzer gefunden wird. Ich musste also rescue anstelle von compare if nil verwenden?
begin
resp = client.get("/users/by-external/#{user.id}")
rescue DiscourseApi::NotFoundError => error
puts error.response.body['errors'].first
sync_user(user)
else
resp.response.env.body['user']
end
Außerdem hat sich die Antwort von resp['body']['user']
zu resp.response.env.body['user']
geändert.
Mein letztes verbleibendes Problem ist, dass ich jetzt einen internen Serverfehler 500 bekomme, wenn ich client.sync_sso aufrufe.
Die Protokolle zeigen ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "user_emails_pkey"
Wenn ich jedoch die exakt gleichen Details im Rails-Terminal verwende und client.sync_sso ausführe, funktioniert es einwandfrei.
Nur zur Information: Ich habe den Endpunkt für die obigen Teile nicht geändert, damit sie wieder funktionieren. Es scheint also, dass /users/by-external/ immer noch gültig ist.