2017-04-01 1 views
0

J'ai actuellement un petit script en cours d'exécution qui envoie un 401 au client, lors de l'annulation et ne fournissant pas de détails sur l'utilisateur le script ne retournera rien.Perl CGI de redirection après l'annulation sur un 401

Je souhaite envoyer une redirection vers la page d'où ils proviennent.

Le sous-programme principal ressemble à ceci;

#!usr/bin/perl 
use strict; 
use CGI; 

sub checkAuth { 
    my ($user, $pass) = &getAuthUsers(); # Get the user and pass of already authenticated users. 
    unless ($user) { 
    &sendAuthenticationHeader(); # Send 401 
    } 

    # Check user against DB and return 1 for success. 
    if (&checkUser($user, $pass) eq 'Y') { return 1 }; 
    else { # This is the redirect I'm trying to issue. 
    my $cgi = CGI->new(); 
    print $cgi->redirect($ENV{HTTP_REFERER}); # Redirect to the referer url 
    exit; 
    } 
} 

Malheureusement, chaque fois que j'essaie d'envoyer de nouveaux en-têtes, il est simplement reçu en texte brut.

Toute aide est appréciée, merci d'avance.

+0

Vous ne pouvez envoyer qu'un en-tête! Vous ne pouvez pas retourner à la fois un 401 et un 302 (redirection). Vous pouvez utiliser un "http-equiv" ou JS pour rediriger le navigateur, mais pourquoi retourner simplement le 302? – ikegami

Répondre

1

sendAuthenticationHeader() émet un en-tête avec un code d'état 401.

print $cgi->redirect($ENV{HTTP_REFERER}); émet un en-tête avec un code d'état 302. Bien sûr, puisque vous avez déjà émis un en-tête, ceci est traité comme le corps.

Il ne sert à rien de renvoyer un 401 si vous souhaitez effectuer une redirection. Changer votre code pour

sub checkAuth { 
    my ($user, $pass) = getAuthUsers(); 

    if (!$user || !checkUser($user, $pass)) { 
    print CGI::redirect($ENV{HTTP_REFERER}); 
    exit; 
    } 
} 

Notes:

  • Suppression incorrecte &. Ne dites pas à Perl d'ignorer le prototype des sous-marins. Résolvez le problème sous-jacent si nécessaire.
  • La valeur de retour de checkUser est un booléen, de sorte qu'il doit retourner soit un vrai ou un faux valeur (par exemple 01 ou), et non pas deux valeurs réelles (par exemple N ou Y). Le code ci-dessus supposait que vous l'aviez corrigé.
+0

Ahh I getcha, juste mis en œuvre. Merci à un groupe d'ikegami. – Fashim