Não tenho certeza do motivo pelo qual você está fazendo as requisições para /users/by-external/<external_id>.json e /admin/users/sync_sso. O fluxo normal seria apenas redirecionar o usuário para /session/sso_login, com o payload SSO definido como parâmetros de consulta na URL. Há detalhes sobre o uso da rota sync_sso aqui: Sync DiscourseConnect user data with the sync_sso route.
Fazer uma requisição para /users/by-external/<external_id> com um external_id que ainda não está associado a um usuário do Discourse deve retornar um erro 404 (não encontrado). Se o external_id estiver associado a um usuário do Discourse, o usuário deve ser retornado.