echo json_encode($response) fungerar inte react.js

Permalänk

echo json_encode($response) fungerar inte react.js

Hej!

Jag håller på med en inloggning och jag skulle vilja föra över en text från PHP till react.js när inloggningen har genomförts.
Men jag får inte echo json_encode($response) att fungera som jag tänkt.
Tänker jag helt fel??

<?php header('Access-Control-Allow-Origin: *'); header("Access-Control-Allow-Credentials: true"); header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'); header('Access-Control-Max-Age: 1000'); header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token , Authorization'); include("connect.php"); $rest_json = file_get_contents("php://input"); $_POST = json_decode($rest_json, true); if( !empty($_POST['loginEmail']) && !empty($_POST['loginPassword'])) { http_response_code(200); $email = $_POST['loginEmail']; $password = $_POST['loginPassword']; $sql = "SELECT email FROM User WHERE email='$email'"; $result = mysqli_query($connect, $sql) or die("Query died: loginEmail"); $num = mysqli_num_rows($result); if($num >0) { $sql = "SELECT password FROM password WHERE password='$password' AND userid = (SELECT userid FROM user WHERE email='$email') "; $result2 = mysqli_query($connect, $sql) or die("Query died: loginPassword"); $num2 = mysqli_num_rows($result2); if($num2 > 0) { $_SESSION['auth']="yes"; $_SESSION['logname'] = $_POST['loginEmail']; $sql = "INSERT INTO Login (loginName, loginTime) VALUES ('$_SESSION[logname]' ,NOW())"; $result3 = mysqli_query($connect, $sql) or die("Query died: insert"); $num3 = mysqli_num_rows($result3); $response = 'true'; echo json_encode($response); if($num3 > 0) { $email = $_POST['loginEmail']; $sql = "SELECT userid FROM User WHERE email='$email'"; $result3 = mysqli_query($connect, $sql) or die("Query died: insert"); $result = $connect ->query($sql); $return_arr = array(); if($result = mysqli_query($connect, $sql)) { while($row = mysqli_fetch_assoc($result)) { $row_array['userid'] = $row['userid']; $response = $row['userid']; array_push($return_arr, $row_array); } } echo json_encode($return_arr); mysqli_close($connect);*/ } } else { $message_1 = "The Login Name, '$_POST[loginEmail]' exists,but you have not entered the correct password! PLease tyr again."; $loginEmail=strip_tags(trim($_POST['loginEmail'])); $response = "false"; echo json_encode($response); } } else { $message_1 = "The User Name you entered does not exists! Please try again."; $response = "false"; echo json_encode($response); } } ?>

loginSubmit(event) { event.preventDefault(); const data = { loginEmail: this.refs.loginEmail.value, loginPassword: this.refs.loginPassword.value } fetch('http://localhost/reusesport/src/api/login.php', { method: 'POST', body: JSON.stringify(data), }) .then(response => { console.log(response); if(response === 'true') { this.props.history.push(`/MySide/:user`); } else { console.log('felaktigt lösenord'); } }) event.target.reset(); }

Console.log(response) ger detta.

Response {type: "cors", url: "http://localhost/reusesport/src/api/login.php", redirected: false, status: 200, ok: true, …}
body: (...)
bodyUsed: false
headers: Headers {}
ok: true
redirected: false
status: 200
statusText: "OK"
type: "cors"
url: "http://localhost/reusesport/src/api/login.php"
__proto__: Response

Tack på förhand!

Permalänk
Medlem

Kolla gärna i Developer Tools i din browser och titta hur responsen från servern ser ut. Är det inte json så kan du inte parsa det till json.

Ett problem som jag ser är att bodyUsed är false vilket betyder att body inte innehåller något. Det borde vara en ReadableStream.

Du borde sätta följande om det är json som returneras från php
header('Content-Type: application/json');

Sen i javascriptet så måste du parsa body innan du kan använda den:

fetch() .then((response) => { console.log(response); //Returnerar samma som du visar return response.json(); }) .then((responseData) => { console.log(responseData); //Returnerar bodyn parsad till json vilket borde göra att du får "responseData.body = true" })

Jag rekommenderar att du skickar med mera saker i responsen, inte bara att det är ok.
Exempelvis att du sätter upp ett objekt/system där du alltid returnerar en json med olika flaggor som du sedan kan använda beroende på vad det är för anrop.
Om man lyckas logga in eller inte räcker inte hela vägen. Det kan vara timeout, exception, inte tillåten att logga in, inloggning avstängd, etc etc.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk

Tack för ditt svar.
En undran, var mer specifikt ser jag hur responsen från servern ser ut.?
Gissar att det är under Network, stämmer det?

Permalänk
Medlem

En annan sak är att din kod är öppen för SQL injektioner, se tex https://www.cloudways.com/blog/protect-php-website-sql-inject...

Permalänk

@trexake: Tack så jättemycket. Hade precis glömt bort att man måste tänka på detta, är väldigt ringrostig med backend.

Permalänk
Medlem

@Snillet71: Det ser ut som om du glömt bort att man inte bör lagra lösenord i klartext i databasen också...

Permalänk

@KAD: Faktiskt inte, har bara inte kommit så långt ännu.

Har funderat på vilken metod jag ska använda, är md5 fortfarande ok att använda eller borde jag använda någon nyare?

Permalänk
Skrivet av Snillet71:

@KAD: Faktiskt inte, har bara inte kommit så långt ännu.

Har funderat på vilken metod jag ska använda, är md5 fortfarande ok att använda eller borde jag använda någon nyare?

Håll dig borta från MD5 Kolla på Password Hashing för att gererera bra hashes.

Permalänk
Medlem

Hur ser din databas ut? Någon anledning att spara password i en annan tabell än User? Du skulle kunna korta ner din kod till att bara göra två SQL queries också, en för att hämta användarinformation och en för att logga inloggningen. Senast jag donade lite med PHP tyckte jag att PDO var väldigt trevligt istället för mysqli_*. Länge sedan jag höll på med lösenordshantering i PHP också. Kanske något liknande?

/* * Assumes: * $dbh already setup * $_POST['loginEmail'] and $_POST['loginPassword'] * The password stored in the database is not the plain password * but the output from password_hash(). */ /* Is this case sensitive? */ $sql = 'SELECT userid, password FROM User where email = ?'; $stmt = $dbh->prepare($sql); if (!$stmt->execute(array($_POST['loginEmail']))) { /* Something went wrong. */ } if ($stmt->rowCount() == 0) { /* User does not exist. */ } /* What if $stmt->rowCount() > 1? */ $result = $stmt->fetch(PDO::FETCH_ASSOC); if (!password_verify($_POST['loginPassword'], $result['password'])) { /* Password is incorrect. */ } $stmt = $dbh->prepare('INSERT INTO Login (loginName, loginTime) VALUES (?, NOW())'); if (!$stmt->execute(array($_POST['loginEmail']))) { /* Fail. */ } /* Return user ID */

Kan vara värt att söka på lite färdiga lösningar för detta också.
Lite bra läsning: https://www.php.net/manual/en/pdo.prepared-statements.php

Permalänk

@trexake: Är relativt nyexad och i skolan pratade de om att man inte bör lagra lösenord i samma tabell som användaruppgifter.
Där av 2 olika tabeller men det kanske inte behövs.

Hittade den här lösningen färdig har bara lagt till lösenorden i en egen tabell.

Permalänk
Medlem
Skrivet av Snillet71:

@trexake: Är relativt nyexad och i skolan pratade de om att man inte bör lagra lösenord i samma tabell som användaruppgifter.
Där av 2 olika tabeller men det kanske inte behövs.

Hittade den här lösningen färdig har bara lagt till lösenorden i en egen tabell.

Okej, har inget direkt svar på det, viktigaste är att lösenorden inte lagras i klartext samt att någon vettig hashalgoritm används. Kolla också på hur du ska salta lösenorden. Så att man tex inte kan se att flera användare har samma lösenord samt att inte kunna kolla mot tabeller enkelt.