2016-05-24 16 views
1

Meine letzte Frage war, wie man grundlegende Authentifizierung in Perl implementieren und ich bekam meine Antwort. danach habe ich versucht, meine code.i geschrieben -status => '401 Not Authorized' in meinem http-Header und wenn ich versuche, mein Programm zu öffnen, will ich mich Benutzer und password.in meinem Code habe ich peice Header mit ENV-Variable, die diesen Benutzernamen und Passwort und überprüfen, ob es das war, was ich will.Mein Problem ist, dass, wenn ich Benutzer und Passwort in Authentifizierungsbox wie unten basic authenticationwie erhalten Antwort HTTP-Header?

eingeben, ich sollte auf Abbrechen Schaltfläche klicken, um Antwortkopf zu erhalten !! Also, was ist OK Button hier? seine mein Bestätigungscode

print header(-type => 'text/html', -status => '401 Not Authorized', 
     'WWW-Authenticate' => 'Basic realm="Videos"'); 

print "<HTML>"; 
print "<HEAD>"; 

print "<TITLE>this is Test-Case</TITLE>"; 
print "</HEAD>"; 

my $signin = $ENV{HTTP_AUTHORIZATION}; 
my($basic,$userpass) = split(' ', $signin); 
($userpass,$eq) = split('=',$userpass); 
$userpass = decode_base64($userpass); 
my ($user,$pass) = split(':',$userpass); 
my $query = new CGI; 
if($user eq 'aa' and $pass eq 'aa'){ 
show something 
} 
else{ 
    print "wrong user or pass"; 
} 

ich versuchte CGI::Auth::Basic bevor zu verwenden, aber es funktioniert nicht in Modul für mich und zeigen Fehler zu arbeiten.

Danke für Ihre Antworten.

Ich löste mein Problem nach einer Weile, also entschied ich mich, die Antwort zu geben, wer dieses Problem auch hat. sollten Sie prüfen, ob $ ENV {HTTP_AUTHORIZATION} definiert ist oder nicht.wenn es definiert ist, sollten Sie den Benutzerpass überprüfen und wenn es wahr ist, drucken Sie "Content-Type: text/HTML", "\ n \ n" bedeutet 200ok ! und wenn der ENV nicht definiert ist sollte man print header (-type => 'text/html', -status => '401 Not Authorized', 'WWW-Authenticate' => 'Basic realm = "Videos"') an Zeigen Sie das Authentifizierungsfeld an.

$signin = $ENV{HTTP_AUTHORIZATION}; 
    if(defined $signin){ 
     check user and password here 
     if(true user and password){ 
      print "Content-Type: text/HTML", "\n\n"; 
      do your all works here 
     } 
     else{ 
      wrong password 
     } 
    } 
    else{ 
     print header(-type => 'text/html', -status => '401 Not Authorized','WWW-Authenticate' => 'Basic realm="Videos"'); 
    } 
+0

Ihr Code sieht gut aus.Haben Sie versucht, die Werte der einzelnen Schritte dazwischen auszugeben ('$ signin, $ basic, $ userpass, $ user, $ pass'), um zu sehen, ob alles so ist, wie Sie gedacht haben? – Sebastian

+0

@Sebastian ja ich drucke sie und alle von ihnen sind korrekt.Sie ​​wissen, dass mein Code funktioniert.aber, nachdem ich auf OK-Schaltfläche klicken Sie auf Abbrechen Schaltfläche! Ich will, dass es funktioniert, nachdem ich auf OK-Taste geklickt habe. – farzane

Antwort

1

HTTP Basic Auth funktioniert in zwei Schritten:

Erster Schritt:

  • Browser sendet eine Anfrage
  • Server mit einer vollständigen HTTP-Response-Antworten (Header, Body) mit HTTP-Statuscode 401
  • Browser zeigt einen (browserspezifischen) Dialog an, um nach Benutzername und Passwort zu fragen
  • "OK" in diesem Dialogfeld typicals startet Schritt 2
  • "Abbrechen" in diesem Dialogfeld zeigt in der Regel die Antwort Körper früher erhalten - aber das hängt von der Browser-Implementierung ab. Verlasse dich nicht darauf!

Zweiter Schritt:

  • Browser erneut sendet die ursprüngliche Anforderung wieder, aber fügt einen Authorization Header
  • Server überprüft Benutzernamen und Passwort ein und sendet eine vollständige Antwort (Header, Body) mit entweder HTTP Statuscode 200 (OK) oder 401 (in diesem Fall: "Benutzername oder Passwort falsch, versuchen Sie es erneut")
  • für Code 401: Siehe Browser-Verhalten für Schritt 1
  • für Code 200: Zeigen Sie auf der Website wie gewohnt
  • Jeder anderer Code gilt auch: A 302 den Benutzer, ein 500 zu umleiten, einen Fehler zu zeigen, usw.

Hoffnung, dass Ihre Frage beantwortet. Wenn nicht, habe ich dein Problem nicht verstanden.

+0

Diese Antwort helfen mir ein wenig, aber mein Problem löste nicht.Wenn ich auf OK klicken, sendet die ursprüngliche Anfrage erneut mit Autorisierungsheader und Browser zeigt Dialog erneut, gegen Überprüfung Benutzername und Passwort, um eine Antwort header.when ich auf Abbrechen zu senden, Antwortheader empfangen !! Ich möchte den Dialog nicht erneut anzeigen. – farzane

+0

Senden Sie immer einen Antwortcode 401? Sie müssen es nicht senden, wenn die Autorisierung erfolgreich war, verwenden Sie in diesem Fall 200. – Sebastian

+0

ich dachte, das ist problem.wenn sollte ich senden 200 OK Antwort header? Können Sie mir einen Code zeigen? Danke – farzane