2017-07-04 1 views
0

J'utilise googleAuth pour l'authentification à 2 facteurs et obtenir l'erreur ci-dessousImpossible de modifier les informations d'en-tête - headers already sent

« Impossible de modifier les informations d'en-tête - têtes déjà envoyés par (output started at ../GoogleAuth/index.php : 2) dans ../GoogleAuth/index.php à la ligne 30. "

ICI est index.php

<?php 
 
include("config.php"); 
 
if(!empty($_SESSION['uid'])) 
 
{ 
 
    header("Location: device_confirmations.php"); 
 
} 
 

 
include('class/userClass.php'); 
 
$userClass = new userClass(); 
 

 
require_once 'googleLib/GoogleAuthenticator.php'; 
 
$ga = new GoogleAuthenticator(); 
 
$secret = $ga->createSecret(); 
 

 
$errorMsgReg=''; 
 
$errorMsgLogin=''; 
 
if (!empty($_POST['loginSubmit'])) 
 
{ 
 
$usernameEmail=$_POST['usernameEmail']; 
 
$password=$_POST['password']; 
 
if(strlen(trim($usernameEmail))>1 && strlen(trim($password))>1) 
 
    { 
 
    $uid=$userClass->userLogin($usernameEmail,$password,$secret); 
 
    if($uid) 
 
    { 
 
     $url=BASE_URL.'device_confirmations.php'; 
 
     header("Location: $url"); 
 
    } 
 
    else 
 
    { 
 
     $errorMsgLogin="Please check login details."; 
 
    } 
 
    } 
 
} 
 

 
if (!empty($_POST['signupSubmit'])) 
 
{ 
 

 
\t $username=$_POST['usernameReg']; 
 
\t $email=$_POST['emailReg']; 
 
\t $password=$_POST['passwordReg']; 
 
    $name=$_POST['nameReg']; 
 
\t $username_check = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $username); 
 
\t $email_check = preg_match('~^[a-zA-Z0-9._-][email protected][a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$~i', $email); 
 
\t $password_check = preg_match('~^[[email protected]#$%^&*()_]{6,20}$~i', $password); 
 

 
\t if($username_check && $email_check && $password_check && strlen(trim($name))>0) 
 
\t { 
 
    
 
    $uid=$userClass->userRegistration($username,$password,$email,$name,$secret); 
 
    if($uid) 
 
    { 
 
    \t $url=BASE_URL.'device_confirmations.php'; 
 
    \t header("Location: $url"); 
 
    } 
 
    else 
 
    { 
 
     $errorMsgReg="Username or Email already exits."; 
 
    } 
 
    
 
\t } 
 
    else 
 
    { 
 
     $errorMsgReg="Enter valid details."; 
 
    } 
 

 

 
} 
 

 
?> 
 
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <title>2-Step Verification using Google Authenticator</title> 
 
    <link rel="stylesheet" type="text/css" href="style.css" charset="utf-8" /> 
 
</head> 
 
<body> 
 
<div id="container"> 
 
    <h1>2-Step Verification using Google Authenticator</h1> 
 
<div id="login"> 
 
<h3>Login</h3> 
 
<form method="post" action="" name="login"> 
 
<label>Username or Email</label> 
 
<input type="text" name="usernameEmail" autocomplete="off" /> 
 
<label>Password</label> 
 
<input type="password" name="password" autocomplete="off"/> 
 
<div class="errorMsg"><?php echo $errorMsgLogin; ?></div> 
 
<input type="submit" class="button" name="loginSubmit" value="Login"> 
 
</form> 
 
</div> 
 

 

 
<div id="signup"> 
 
<h3>Registration</h3> 
 
<form method="post" action="" name="signup"> 
 
<label>Name</label> 
 
<input type="text" name="nameReg" autocomplete="off" /> 
 
<label>Email</label> 
 
<input type="text" name="emailReg" autocomplete="off" /> 
 
<label>Username</label> 
 
<input type="text" name="usernameReg" autocomplete="off" /> 
 

 
<label>Password</label> 
 
<input type="password" name="passwordReg" autocomplete="off"/> 
 
<div class="errorMsg"><?php echo $errorMsgReg; ?></div> 
 
<input type="submit" class="button" name="signupSubmit" value="Signup"> 
 
</form> 
 
</div> 
 

 
</div> 
 

 
</body> 
 
</html>

device_confirmation.php

<?php 
 
include('config.php'); 
 

 
if(empty($_SESSION['uid'])) 
 
{ 
 
\t header("Location: index.php"); 
 
} 
 

 
include('class/userClass.php'); 
 
$userClass = new userClass(); 
 
$userDetails=$userClass->userDetails($_SESSION['uid']); 
 
$secret=$userDetails->google_auth_code; 
 
$email=$userDetails->email; 
 

 
require_once 'googleLib/GoogleAuthenticator.php'; 
 

 
$ga = new GoogleAuthenticator(); 
 

 
$qrCodeUrl = $ga->getQRCodeGoogleUrl($email, $secret,'9lessons Demos'); 
 

 

 
?> 
 
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <title>2-Step Verification using Google Authenticator</title> 
 
    <link rel="stylesheet" type="text/css" href="style.css" charset="utf-8" /> 
 
</head> 
 
<body> 
 
\t <div id="container"> 
 
\t \t <h1>2-Step Verification using Google Authenticator</h1> 
 
\t \t <div id='device'> 
 

 
<p>Enter the verification code generated by Google Authenticator app on your phone.</p> 
 
<div id="img"> 
 
<img src='<?php echo $qrCodeUrl; ?>' /> 
 
</div> 
 

 
<form method="post" action="home.php"> 
 
<label>Enter Google Authenticator Code</label> 
 
<input type="text" name="code" /> 
 
<input type="submit" class="button"/> 
 
</form> 
 
</div> 
 
<div style="text-align:center"> 
 
\t <h3>Get Google Authenticator on your phone</h3> 
 
<a href="https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8" target="_blank"><img class='app' src="images/iphone.png" /></a> 
 

 
<a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en" target="_blank"><img class="app" src="images/android.png" /></a> 
 
</div> 
 
</div> 
 
</body> 
 
</html>

config.php

<?php 
 
session_start(); 
 
/* DATABASE CONFIGURATION */ 
 
define('DB_SERVER', 'localhost'); 
 
define('DB_USERNAME', 'root'); 
 
define('DB_PASSWORD', ''); 
 
define('DB_DATABASE', 'demos'); 
 
define("BASE_URL", "http://localhost/GoogleAuth/"); // Eg. http://yourwebsite.com 
 

 

 
function getDB() 
 
{ 
 
\t $dbhost=DB_SERVER; 
 
\t $dbuser=DB_USERNAME; 
 
\t $dbpass=DB_PASSWORD; 
 
\t $dbname=DB_DATABASE; 
 
\t try { 
 
\t $dbConnection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); \t 
 
\t $dbConnection->exec("set names utf8"); 
 
\t $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
 
\t return $dbConnection; 
 
    } 
 
    catch (PDOException $e) { 
 
    echo 'Connection failed: ' . $e->getMessage(); 
 
\t } 
 

 
} 
 
?>

et home.php

<?php 
 
include('config.php'); 
 
include('class/userClass.php'); 
 
$userClass = new userClass(); 
 
$userDetails=$userClass->userDetails($_SESSION['uid']); 
 

 
if($_POST['code']) 
 
{ 
 
$code=$_POST['code']; 
 
$secret=$userDetails->google_auth_code; 
 
require_once 'googleLib/GoogleAuthenticator.php'; 
 
$ga = new GoogleAuthenticator(); 
 
$checkResult = $ga->verifyCode($secret, $code, 2); // 2 = 2*30sec clock tolerance 
 

 
if ($checkResult) 
 
{ 
 
$_SESSION['googleCode']=$code; 
 

 

 
} 
 
else 
 
{ 
 
echo 'FAILED'; 
 
} 
 

 
} 
 

 

 
include('session.php'); 
 
$userDetails=$userClass->userDetails($session_uid); 
 

 
?> 
 
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <title>2-Step Verification using Google Authenticator</title> 
 
    <link rel="stylesheet" type="text/css" href="style.css" charset="utf-8" /> 
 
</head> 
 
<body> 
 
\t <div id="container"> 
 
<h1>Welcome <?php echo $userDetails->name; ?></h1> 
 

 
<pre> 
 
<?php print_r($userDetails); ?> 
 
</pre> 
 
<h4><a href="<?php echo BASE_URL; ?>logout.php">Logout</a></h4> 
 
</div> 
 
</body> 
 
</html>

S'il vous plaît me dire où je me trompais

Répondre

1

Cela se produit lorsque vous utilisez des fonctions telles que header et setcookie après avoir commencé à envoyer la sortie au navigateur. Les en-têtes HTTP ne peuvent pas être modifiés après que vous ayez commencé à envoyer le corps de la requête, vous devez donc vous assurer qu'aucun contenu n'est envoyé avant qu'un appel ne soit effectué pour ces fonctions.

C'est une des raisons pour lesquelles c'est une bonne idée de séparer le code PHP de la génération de sortie (HTML). La plupart des frameworks PHP majeurs utilisent pour cela des moteurs Template séparés, comme Twig ou Smarty.

Si vous avez un grand projet mal construit, où c'est un effort excessif pour s'assurer que la sortie est générée après que les en-têtes doivent être définis, vous pouvez utiliser les fonctions Output Control de PHP comme solution de contournement rapide.