用简单的登录方式用ajax和PHP重新学习

问题描述 投票:-1回答:2

我使用一键提交和电子邮件输入进行登录。但是当我想添加recaptcha google v2时。我发现了很多问题。请帮我。

index.php文件:

require_once 'includes/main.php';


/*--------------------------------------------------
    Handle visits with a login token. If it is
    valid, log the person in.
---------------------------------------------------*/


if(isset($_GET['tkn'])){

    // Is this a valid login token?
    $user = User::findByToken($_GET['tkn']);

    if($user){

        // Yes! Login the user and redirect to the protected page.

        $user->login();
        redirect('protected.php');
    }

    // Invalid token. Redirect back to the login form.
    redirect('index.php');
}



/*--------------------------------------------------
    Handle logging out of the system. The logout
    link in protected.php leads here.
---------------------------------------------------*/


if(isset($_GET['logout'])){

    $user = new User();

    if($user->loggedIn()){
        $user->logout();
    }

    redirect('index.php');
}


/*--------------------------------------------------
    Don't show the login page to already 
    logged-in users.
---------------------------------------------------*/


$user = new User();

if($user->loggedIn()){
    redirect('protected.php');
}



/*--------------------------------------------------
    Handle submitting the login form via AJAX
---------------------------------------------------*/


try{

    if(!empty($_POST) && isset($_SERVER['HTTP_X_REQUESTED_WITH'])){

        // Output a JSON header

        header('Content-type: application/json');

        // Is the email address valid?

        if(!isset($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
            throw new Exception('Please enter a valid email.');
        }

        // This will throw an exception if the person is above 
        // the allowed login attempt limits (see functions.php for more):
        rate_limit($_SERVER['REMOTE_ADDR']);

        // Record this login attempt
        rate_limit_tick($_SERVER['REMOTE_ADDR'], $_POST['email']);

        // Send the message to the user

        $message = '';
        $email = $_POST['email'];
        $subject = 'Your Login Link';

        if(!User::exists($email)){
            $subject = "Thank You For Registering!";
            $message = "Thank you for registering at our site!\n\n";
        }

        // Attempt to login or register the person
        $user = User::loginOrRegister($_POST['email']);


        $message.= "You can login from this URL:\n";
        $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

        $message.= "The link is going expire automatically after 10 minutes.";

        $result = send_email($fromEmail, $_POST['email'], $subject, $message);

        if(!$result){
            throw new Exception("There was an error sending your email. Please try again.");
        }

        die(json_encode(array(
            'message' => 'Thank you! We\'ve sent a link to your inbox. Check your spam folder as well.'
        )));
    }
}
catch(Exception $e){

    die(json_encode(array(
        'error'=>1,
        'message' => $e->getMessage()
    )));
}

/*--------------------------------------------------
    Output the login form
---------------------------------------------------*/

?>

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8"/>
        <title></title>

        <link href="http://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">

        <!-- The main CSS file -->
        <link href="assets/css/style.css" rel="stylesheet" />

        <!--[if lt IE 9]>
            <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
    </head>

    <body>

        <form id="login-register" method="post" action="index.php">

            <h1>Login or Register</h1>

            <input type="text" placeholder="[email protected]" name="email" autofocus />
            <p>Enter your email address above and we will send <br />you a login link.</p>

            <button type="submit">Login / Register</button>

            <span></span>

        </form>

        <footer>
            <a class="tz" href="#">#</a>
            <div id="tzine-actions"></div>
            <span class="close"></span>
        </footer>

        <!-- JavaScript Includes -->
        <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
        <script src="assets/js/script.js"></script>

    </body>
</html>

ajax script.js:

$(function(){

    var form = $('#login-register');

    form.on('submit', function(e){

        if(form.is('.loading, .loggedIn')){
            return false;
        }

        var email = form.find('input').val(),
            messageHolder = form.find('span');

        e.preventDefault();

        $.post(this.action, {email: email}, function(m){

            if(m.error){
                form.addClass('error');
                messageHolder.text(m.message);
            }
            else{
                form.removeClass('error').addClass('loggedIn');
                messageHolder.text(m.message);
            }
        });

    });

    $(document).ajaxStart(function(){
        form.addClass('loading');
    });

    $(document).ajaxComplete(function(){
        form.removeClass('loading');
    });
});

整整一周前我试试。但没有结果。我需要它为我的网站脚本。请帮助我,我不知道我是否会继续没有验证码的脚本。

谢谢你们。

我尝试将此代码放在ajax中但不起作用

$(function(){



var onloadCallback = function() {
    grecaptcha.render('recapptcha', {
    'sitekey' : '-------key----------'
  });
};
onloadCallback();


    var form = $('#login-register');

    form.on('submit', function(e){



  if(grecaptcha.getResponse() == "") {
    e.preventDefault();
    alert("You can't proceed!");
  } else {  



        if(form.is('.loading, .loggedIn')){
            return false;
        }

        var email = form.find('input').val(),
            messageHolder = form.find('span');

        e.preventDefault();

        $.post(this.action, {email: email}, function(m){

            if(m.error){
                form.addClass('error');
                messageHolder.text(m.message);
            }
            else{
                form.removeClass('error').addClass('loggedIn');
                messageHolder.text(m.message);
            }
        });

 }//recaptcha end tag

    });

    $(document).ajaxStart(function(){
        form.addClass('loading');
    });

    $(document).ajaxComplete(function(){
        form.removeClass('loading');
    });
});

我不知道我如何用ajax添加代码验证码?

更新:

兄弟(madalinivascu)我现在把你的第一个代码javascript放在script.js中它运行良好,因为它发送两个值到http头电子邮件:[email protected]和验证码:xxxxxxxxxxxxxxx ...

script.js中的新代码变为:

$(function(){

    var form = $('#login-register');

    form.on('submit', function(e){

        if(form.is('.loading, .loggedIn')){
            return false;
        }

        var email = form.find('input').val(),
            messageHolder = form.find('span');

        e.preventDefault();

                //This code i added
                $.post(this.action, {email: email, captcha: grecaptcha.getResponse()}, function(m){

            if(m.error){
                form.addClass('error');
                messageHolder.text(m.message);
            }
            else{
                form.removeClass('error').addClass('loggedIn');
                messageHolder.text(m.message);
            }
        });

    });

    $(document).ajaxStart(function(){
        form.addClass('loading');
    });

    $(document).ajaxComplete(function(){
        form.removeClass('loading');
    });
});

但在index.php文件中我不知道我把这段代码放在哪里:

$secret="YOUR_SECRET";
$response=$_POST["captcha"];

$verify=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}");
$captcha_success=json_decode($verify);
if (!$captcha_success->success) {
  //This user was not verified by recaptcha, send error message

}
else {
  //This user is verified by recaptcha, continue

}

我尝试了几次尝试并没有成功。 index.php代码:(不工作)

    <?php

    require_once 'includes/main.php';


    /*--------------------------------------------------
        Handle visits with a login token. If it is
        valid, log the person in.
    ---------------------------------------------------*/


    if(isset($_GET['tkn'])){

        // Is this a valid login token?
        $user = User::findByToken($_GET['tkn']);

        if($user){

            // Yes! Login the user and redirect to the protected page.

            $user->login();
            redirect('protected.php');
        }

        // Invalid token. Redirect back to the login form.
        redirect('index.php');
    }



    /*--------------------------------------------------
        Handle logging out of the system. The logout
        link in protected.php leads here.
    ---------------------------------------------------*/


    if(isset($_GET['logout'])){

        $user = new User();

        if($user->loggedIn()){
            $user->logout();
        }

        redirect('index.php');
    }


    /*--------------------------------------------------
        Don't show the login page to already 
        logged-in users.
    ---------------------------------------------------*/


    $user = new User();

    if($user->loggedIn()){
        redirect('protected.php');
    }



    /*--------------------------------------------------
        Handle submitting the login form via AJAX
    ---------------------------------------------------*/



    ////////////////////start code recaptcha/////////////////
$secret="YOUR_SECRET";
$response=$_POST["captcha"];

$verify=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}");
$captcha_success=json_decode($verify);
if (!$captcha_success->success) {
  //This user was not verified by recaptcha, send error message

}
else {
  //This user is verified by recaptcha, continue

}
    ////////////////////end code recaptcha/////////////////

    try{


        if(!empty($_POST) && isset($_SERVER['HTTP_X_REQUESTED_WITH'])){

            // Output a JSON header

            header('Content-type: application/json');

            // Is the email address valid?

            if(!isset($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
                throw new Exception('Please enter a valid email.');
            }

            // This will throw an exception if the person is above 
            // the allowed login attempt limits (see functions.php for more):
            rate_limit($_SERVER['REMOTE_ADDR']);

            // Record this login attempt
            rate_limit_tick($_SERVER['REMOTE_ADDR'], $_POST['email']);

            // Send the message to the user

            $message = '';
            $email = $_POST['email'];
            $subject = 'Your Login Link';







            if(!User::exists($email)){
                $subject = "Thank You For Registering!";
                $message = "Thank you for registering at our site!\n\n";
            }

            // Attempt to login or register the person
            $user = User::loginOrRegister($_POST['email']);


            $message.= "You can login from this URL:\n";
            $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

            $message.= "The link is going expire automatically after 10 minutes.";

            $result = send_email($fromEmail, $_POST['email'], $subject, $message);

            if(!$result){
                throw new Exception("There was an error sending your email. Please try again.");
            }

            die(json_encode(array(
                'message' => 'Thank you! We\'ve sent a link to your inbox. Check your spam folder as well.'
            )));
        }








    }
    catch(Exception $e){

        die(json_encode(array(
            'error'=>1,
            'message' => $e->getMessage()
        )));
    }

    /*--------------------------------------------------
        Output the login form
    ---------------------------------------------------*/


    ?>

    <!DOCTYPE html>
    <html>

        <head>
            <meta charset="utf-8"/>
            <title></title>

            <link href="http://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">

            <!-- The main CSS file -->
            <link href="assets/css/style.css" rel="stylesheet" />

            <!--[if lt IE 9]>
                <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
            <![endif]-->
                            <script src="https://www.google.com/recaptcha/api.js" async defer></script>
        </head>

        <body>

            <form id="login-register" method="post" action="index.php">

                <h1>Login or Register</h1>

                <input type="text" placeholder="[email protected]" name="email" autofocus />
                <p>Enter your email address above and we will send <br />you a login link.</p>

                            <div class="g-recaptcha" data-sitekey="6LcBtjwUAAAAAAFmvS_I2XPhiNGw9vyTdphNp9pq"></div>

                <button type="submit" name="submit">Login / Register</button>

                <span></span>

            </form>

            <footer>
                <a class="tz" href="#">#</a>
                <div id="tzine-actions"></div>
                <span class="close"></span>
            </footer>

            <!-- JavaScript Includes -->
            <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
            <script src="assets/js/script.js"></script>

        </body>
    </html>

请帮我。非常感谢你。我把code recrapcha放在index.php文件中:

javascript php jquery ajax recaptcha
2个回答
0
投票

通过ajax将验证码响应发送到php脚本:

$.post(this.action, {email: email,captcha: grecaptcha.getResponse()}, function(m){

在PHP中你需要这样的东西

$secret="YOUR_SECRET";
$response=$_POST["captcha"];

$verify=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}");
$captcha_success=json_decode($verify);
if (!$captcha_success->success) {
  //This user was not verified by recaptcha, send error message

}
else {
  //This user is verified by recaptcha, continue

}

0
投票

经过多次尝试,我找到了将验证码添加到表单的正确方法。正确的代码是:script.js(ajax):

$(function(){

    var form = $('#login-register');

    form.on('submit', function(e){

        if(form.is('.loading, .loggedIn')){
            return false;
        }

        var email = form.find('input').val(),
            messageHolder = form.find('span');

        e.preventDefault();

        //$.post(this.action, {email: email}, function(m){

                $.post(this.action, {email: email, captcha: grecaptcha.getResponse()}, function(m){

            if(m.error){
                form.addClass('error');
                messageHolder.text(m.message);
            }
            else{
                form.removeClass('error').addClass('loggedIn');
                messageHolder.text(m.message);
            }
        });

    });

    $(document).ajaxStart(function(){
        form.addClass('loading');
    });

    $(document).ajaxComplete(function(){
        form.removeClass('loading');
    });
});

index.php文件:

<?php

require_once 'includes/main.php';


/*--------------------------------------------------
    Handle visits with a login token. If it is
    valid, log the person in.
---------------------------------------------------*/


if(isset($_GET['tkn'])){

    // Is this a valid login token?
    $user = User::findByToken($_GET['tkn']);

    if($user){

        // Yes! Login the user and redirect to the protected page.

        $user->login();
        redirect('protected.php');
    }

    // Invalid token. Redirect back to the login form.
    redirect('index.php');
}



/*--------------------------------------------------
    Handle logging out of the system. The logout
    link in protected.php leads here.
---------------------------------------------------*/


if(isset($_GET['logout'])){

    $user = new User();

    if($user->loggedIn()){
        $user->logout();
    }

    redirect('index.php');
}


/*--------------------------------------------------
    Don't show the login page to already 
    logged-in users.
---------------------------------------------------*/


$user = new User();

if($user->loggedIn()){
    redirect('protected.php');
}


/*--------------------------------------------------
            get result of captcha
---------------------------------------------------*/
if($_SERVER["REQUEST_METHOD"] === "POST")
    {
        //form submitted

        //check if other form details are correct

        //verify captcha
        $recaptcha_secret = "-----your-secret-key-----";
        $response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$recaptcha_secret."&response=".$_POST['captcha']);
        $response = json_decode($response, true);

    }

/*--------------------------------------------------
    Handle submitting the login form via AJAX
---------------------------------------------------*/

try{


    if(!empty($_POST)  && isset($_POST["captcha"]) && isset($_SERVER['HTTP_X_REQUESTED_WITH'])){

        // Output a JSON header

        header('Content-type: application/json');

        // Is the email address valid?

        if(!isset($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
            throw new Exception('Please enter a valid email.');
        }

       if(!$response["success"] === true){
            throw new Exception('Please check captcha.');
        }

        // This will throw an exception if the person is above 
        // the allowed login attempt limits (see functions.php for more):
        rate_limit($_SERVER['REMOTE_ADDR']);

        // Record this login attempt
        rate_limit_tick($_SERVER['REMOTE_ADDR'], $_POST['email']);

        // Send the message to the user

        $message = '';
        $email = $_POST['email'];
        $subject = 'Your Login Link';

        if(!User::exists($email)){
            $subject = "Thank You For Registering!";
            $message = "Thank you for registering at our site!\n\n";
        }

        // Attempt to login or register the person
        $user = User::loginOrRegister($_POST['email']);


        $message.= "You can login from this URL:\n";
        $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

        $message.= "The link is going expire automatically after 10 minutes.";

        $result = send_email($fromEmail, $_POST['email'], $subject, $message);

        if(!$result){
            throw new Exception("There was an error sending your email. Please try again.");
        }

        die(json_encode(array(
            'message' => 'Thank you! We\'ve sent a link to your inbox. Check your spam folder as well.'
        )));
    }


}
catch(Exception $e){

    die(json_encode(array(
        'error'=>1,
        'message' => $e->getMessage()
    )));
}

/*--------------------------------------------------
    Output the login form
---------------------------------------------------*/

?>

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8"/>
        <title>#</title>

        <link href="http://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">

        <!-- The main CSS file -->
        <link href="assets/css/style.css" rel="stylesheet" />

        <!--[if lt IE 9]>
            <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
                        <script src="https://www.google.com/recaptcha/api.js"></script>
    </head>

    <body>

        <form id="login-register" method="post" action="index.php">

            <h1>Login or Register</h1>

            <input type="text" placeholder="[email protected]" name="email" autofocus />
            <p>Enter your email address above and we will send <br />you a login link.</p>

                        <div class="g-recaptcha" data-sitekey="------yoursitekey------"></div>

            <button type="submit" name="submit">Login / Register</button>

            <span></span>

        </form>

        <footer>
            <a class="tz" href="#"></a>
            <div id="tzine-actions"></div>
            <span class="close"></span>
        </footer>

        <!-- JavaScript Includes -->
        <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
        <script src="assets/js/script.js"></script>

    </body>
</html>

我在这里遇到的错误:我把这段代码:if(isset ($ _ POST ["g-recaptcha-response"]))但是对我有用的是:if(isset ($ _ POST ["captcha"]))和我把这个代码:if(isset($_POST['Submit'])){...}但在这种情况下正确的代码是:if($_SERVER["REQUEST_METHOD"] === "POST"){...}我也没有把一些代码放在正确的地方。重要的是我成功了。感谢上帝和帮助过我或试图帮助我的每个人。特别感谢兄弟'madalinivascu'

© www.soinside.com 2019 - 2024. All rights reserved.