Avatar billede SSC Juniormester
02. november 2020 - 19:29 Der er 4 kommentarer og
1 løsning

Problemer med 'log in application'

Hej Computerworld,

Jeg sidder med  et problem, som jeg efter et tidsrum ikke endnu har kunne løse:

Jeg her lavet en login-applikation, men hver gang logger ind får jeg "invalid user" (selvom brugeren er eksisternede in min DB)

Koden er herunder

<?php


session_start();



require_once "Auth.php";
require_once "Util.php";





$auth = new Auth();
$db_handle = new DBController();
$util = new Util();

require_once "authCookieSessionValidate.php";

if ($isLoggedIn) {
    $util->redirect("dashboard.php");
}

if (! empty($_POST["login"])) {
    $isAuthenticated = false;
   
    $username = $_POST["user"];
    $password = $_POST["pass"];
   
    $user = $auth->getMemberByUsername($username);
    if (password_verify($password, $user[0]["pass"])) {
        $isAuthenticated = true;
    }
   
    if ($isAuthenticated) {
        $_SESSION["user"] = $user[0]["user"];
       
        // Set Auth Cookies if 'Remember Me' checked
        if (! empty($_POST["remember"])) {
            setcookie("member_login", $username, $cookie_expiration_time);
           
            $random_password = $util->getToken(16);
            setcookie("random_password", $random_password, $cookie_expiration_time);
           
            $random_selector = $util->getToken(32);
            setcookie("random_selector", $random_selector, $cookie_expiration_time);
           
            $random_password_hash = password_hash($random_password, PASSWORD_DEFAULT);
            $random_selector_hash = password_hash($random_selector, PASSWORD_DEFAULT);
           
            $expiry_date = date("Y-m-d H:i:s", $cookie_expiration_time);
           
            // mark existing token as expired
            $userToken = $auth->getTokenByUsername($username, 0);
            if (! empty($userToken[0]["id"])) {
                $auth->markAsExpired($userToken[0]["id"]);
            }
            // Insert new token
            $auth->insertToken($username, $random_password_hash, $random_selector_hash, $expiry_date);
        } else {
            $util->clearAuthCookie();
        }
        $util->redirect("dashboard.php");
    } else {
        $message = "Invalid Login";
    }
}
?>
<style>
body {
    font-family: Arial;
}

#frmLogin {
    padding: 20px 40px 40px 40px;
    background: #d7eeff;
    border: #acd4f1 1px solid;
    color: #333;
    border-radius: 2px;
    width: 300px;
}

.field-group {
    margin-top: 15px;
}

.input-field {
    padding: 12px 10px;
    width: 100%;
    border: #A3C3E7 1px solid;
    border-radius: 2px;
    margin-top: 5px
}

.form-submit-button {
    background: #3a96d6;
    border: 0;
    padding: 10px 0px;
    border-radius: 2px;
    color: #FFF;
    text-transform: uppercase;
    width: 100%;
}

.error-message {
    text-align: center;
    color: #FF0000;
}
</style>

<form action="" method="post" id="frmLogin">
    <div class="error-message"><?php if(isset($message)) { echo $message; } ?></div>
    <div class="field-group">
        <div>
            <label for="login">Username</label>
        </div>
        <div>
            <input name="user" type="text"
                value="<?php if(isset($_COOKIE["member_login"])) { echo $_COOKIE["member_login"]; } ?>"
                class="input-field">
        </div>
    </div>
    <div class="field-group">
        <div>
            <label for="password">Password</label>
        </div>
        <div>
            <input name="pass" type="password"
                value="<?php if(isset($_COOKIE["pass"])) { echo $_COOKIE["pass"]; } ?>"
                class="input-field">
        </div>
    </div>
    <div class="field-group">
        <div>
            <input type="checkbox" name="remember" id="remember"
                <?php if(isset($_COOKIE["member_login"])) { ?> checked
                <?php } ?> /> <label for="remember-me">Remember me</label>
        </div>
    </div>
    <div class="field-group">
        <div>
            <input type="submit" name="login" value="Login"
                class="form-submit-button"></span>
        </div>
    </div>
</form>

Tak for hjælpen på forhånd,

vh SSC
Avatar billede olsensweb.dk Ekspert
02. november 2020 - 20:32 #1
jeg tror det er her det fejler:
if (password_verify($password, $user[0]["pass"])) {
    $isAuthenticated = true;
}


har du prøvet at lave en print_r($user), så du kan se om der står det rigtige i $user[0]
er password hashed i database tabellen ?? (det skal det)
hedder collonnerne det rigtige ??

har du slået debug til, så længe du udvikler ?? hvis ikke gør det
Avatar billede SSC Juniormester
03. november 2020 - 12:11 #2
Ah, tak!

Jeg får meddelen Array ( [0] => Array ( [user] => 11 [pass] => $2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq [email] => 11 [first] => 11 [last] => 11 ) )

(skidt pyt med, at kodeordet vises, jeg sletter brugeren senere)

Jeg tror problemet ligger i, at jeg ikke har nogen id kolonne i min database (fordi jeg har skrevet hele 'projektet' uden kolonnen (tænker der meget arbejde i at implementere kolonnen, hvis jeg skal  ændre alle filerne)

Er det muligt at gøre det uden id-kolonne? (jeg forstår godt problemet, den skriver jo  [0]  til at starte med, så den kan formentligt ikke finde id, derfor går det galt)
Avatar billede olsensweb.dk Ekspert
03. november 2020 - 13:22 #3
>$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq
det burde være password i klar text formindelig rasmuslerdorf

ref https://www.php.net/manual/en/function.password-verify.php
Example #1 password_verify() example
<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>


havde forvendtet du loggede ind som user admin og password admin som der står i
https://phppot.com/php/secure-remember-me-for-login-using-php-session-and-cookies/


er det denne tabel og indhold du anvender ??
CREATE TABLE `members` (
  `member_id` int(8) NOT NULL,
  `member_name` varchar(255) CHARACTER SET utf8 NOT NULL,
  `member_password` varchar(64) NOT NULL,
  `member_email` varchar(255) CHARACTER SET utf8 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `members`
--

INSERT INTO `members` (`member_id`, `member_name`, `member_password`, `member_email`) VALUES
(1, 'admin', '$2a$10$0FHEQ5/cplO3eEKillHvh.y009Wsf4WCKvQHsZntLamTUToIBe.fG', 'user@gmail.com');



>(skidt pyt med, at kodeordet vises, jeg sletter brugeren senere)
det skal står hashed i db og indskrivet i formen i klar tesxt

>Er det muligt at gøre det uden id-kolonne?
søg filerne igennem efter menber_id, og se om det bruges.


tag hele projected ned herfra
https://phppot.com/downloads/secure-remember-me-for-login-using-php-session-and-cookies.zip

ret til, og test løbende
jeg ville starte med at omdøbe member_password til pass og rette i sql til det virker igen, så du lærer coden at kende

dette er ikke et begynder project.


læs op på:
https://www.php.net/manual/en/function.password-hash.php
https://www.php.net/manual/en/function.password-verify.php

evt også på: (selvom jeg foretrækker password-hash)
https://www.php.net/manual/en/function.crypt.php
Avatar billede SSC Juniormester
03. november 2020 - 19:38 #4
Hej igen,

Tusind tak for alt det bruge info, så cool!

Jeg prøvede en del forskellige ting (korrekt, jeg bruger https://phppot.com/downloads/secure-remember-me-for-login-using-php-session-and-cookies.zip), men det viser sig, at det er muligt at fjerne id :-)

(Virker nu)

Endnu engang tak fior hjælpen!

God aften,

Vh SSC
Avatar billede olsensweb.dk Ekspert
03. november 2020 - 19:58 #5
>men det viser sig, at det er muligt at fjerne id :-)
er det klogt at fjerne id ??
en bruger kan vel skifte brugernavn/logon navn med tiden !!, men ikke id
med en id får du det også nemmere når du joiner andre tabeller (mere standart code)

hvis du arbejder med framework er der mange der forvendter primær nøgle hedder id

coden bliver nemmere at genbruge og logisk, men det vil du nok se når du laver resten af CRUD, og evt flere tabeller
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester