Redirecionar para o pedido HTTP original (POST) após a autenticação no Node.js

0

Eu tenho um código node.js que usa a estratégia de conexão passport openId para autenticação. Ele redireciona de volta para a URL original após a autenticação, no entanto, se eu enviar um formulário com POST enquanto a sessão expirar, ele não redirecionará para a URL original como uma operação POST, mas a alterará para a solicitação GET.

Eu quero saber, existe alguma maneira possível, onde eu possa armazenar o tipo de pedido e após a autenticação, ele faz a mesma operação.

meu código app.js é assim:

app.get('/login', passport.authenticate('openidconnect', {})); 

function ensureAuthenticated(req, res, next) {
    if (!req.isAuthenticated()) {
        req.session.originalUrl = req.originalUrl;
        res.redirect('/login');
    } else {
        return next();
    }
}

app.get('/auth/sso/callback',function(req, res, next) {
    var redirect_url = req.session.originalUrl;
    passport.authenticate('openidconnect', {
        successRedirect: redirect_url,
        failureRedirect: '/failure',
    })(req,res,next);
});

PS: Autenticação e outros redirecionamentos gerais funcionam bem .. o problema é apenas com envio de formulário POST.

    
por Kandarp Thakar 22.07.2016 / 23:08

2 respostas

2

O problema aqui é que, ao executar a solicitação POST original, ela (provavelmente) tem um corpo com os dados de postagem. A ensureAuthenticated check redireciona para a página de login e, portanto, perde os post-data!

Após a autenticação bem-sucedida, quando você redireciona para o URL original, não há como saber quais pós-dados enviar com a solicitação POST.

Uma maneira de pensar é manter o último URL de solicitação GET usado, armazená-lo na sessão e usá-lo em seu "após o redirecionamento de login" e, assim, retornar à página antes de enviar a solicitação POST. Isso significa que, infelizmente, o usuário precisa preencher o formulário novamente (já que é necessário "reconstruir" os dados do post que você perdeu de alguma forma).

Você pode fazer isso adicionando um manipulador use no início do aplicativo que armazena a URL no objeto da sessão se a solicitação for do tipo GET. Eu iria fornecer um trecho de código para você, mas infelizmente estou no meu celular em férias, então eu tenho medo que pode ser um pouco difícil de fazer, me desculpe: (

    
por 22.07.2016 / 23:53
0

Eu encontrei um trabalho para isso. O que estou fazendo agora é, estou armazenando parâmetros POST nas variáveis globais primeiro e, em seguida, estou chamando a função assegurada de autenticação.

Após a função assegurada, ela redireciona para o URL original como uma solicitação GET, mas como eu tenho os parâmetros de postagem armazenados na variável global, posso continuar minhas operações.

Obrigado pela sua ideia. É algo para tentar.

    
por 24.07.2016 / 00:02