ya pude resolverlo
Parece que actualizaron el código para lanzar un error si no se encuentra ningún usuario, así que tuve que usar rescue en lugar de comparar si era nil.
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
Además, la respuesta ha cambiado de
resp['body']['user']
a
resp.response.env.body['user']
Mi último problema pendiente es que cuando llamo a client.sync_sso, ahora obtengo un error interno del servidor 500.
Los registros muestran
ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "user_emails_pkey")
Sin embargo, si uso los mismos detalles en la terminal de Rails y ejecuto client.sync_sso, funciona perfectamente.
Solo para que lo sepas, no cambié el endpoint para que las partes anteriores volvieran a funcionar, así que parece que /users/by-external/ sigue siendo válido.