Kjapp og trygg hosting for Wordpress

Hvordan lage autologin?

halvors

New Member
Hei!

Jeg har en login.

Hvordan kan jeg lage det slik at en bruker kan klikke på en knapp "Husk meg" og så neste gang de besøker siden blir de automatisk logget inn. (innenfor en hvis tid eks. en dag)?

PS: Bare info jeg bruker session, er det en annen måte jeg bør benytte?

Halvor.
 
Sessions er supert for å holde brukeren innlogget, men de slutter å virke når du lukker nettleseren. Ting som skal huskes lengre enn det kan du lagre i en cookie. La scriptet ditt sjekke om "husk meg" er avkrysset, og dersom det er tilfelle lagrer du innloggingsinfo i cookies. Deretter legger du inn en kodesnutt som når brukeren kommer inn på sida sjekker om denne cookien har en verdi, og dersom det er tilfelle lagrer du denne verdien i sessionen som forteller scriptet at brukeren er innlogget. Mener å huske at du finner det ganske godt forklart om du slår opp cookies i php.net, hvis du får problemer skal du få en kodesnutt av meg i morgen.

Lykke til!
 

michaelo

Medlem
Prosessen som nevnt av olafmoriarty her er veldig riktig, så dette er bare et lite tillegg: jeg ville ikke lagret all login-informasjon (som passord) i klartekst, men heller generert et hash som også blir lagret i databasen på samme måte som passordet og dermed sjekket mot dette i stedet. Dette hashet bør da genereres med tidspunktet for "innlogging med avhuket husk-meg" som en av flere faktorer.
 
Som lovet, her er koden jeg bruker selv. Denne koden er i bruk på AndebyOnline.com, og den er noen år gammel og kan sannsynligvis forbedres ganske mye -- men det er et utgangspunkt.

Kode:
<?php

session_start();



// Dersom brukeren kommer fra innloggingsskjemaet, lagrer jeg brukernavnet
// og en kryptert utgave av passordet i sessions.

if (isset($_POST['brukarnamn']))
	$_SESSION['brukarnamn'] = $_POST['brukarnamn'];
if (isset($_POST['passord']))
	$_SESSION['krypassord'] = md5($_POST['passord']);



// Dersom brukeren har trykket på «Logg ut»-knappen, skal både sessions og
// alle cookies tømmes, nullstilles, slettes, elimineres.

if (isset($_GET['logout']) && $_GET['logout']) {
	unset($_SESSION['brukarnamn']);
	unset($_SESSION['krypassord']);
	$_SESSION['utlogga'] = 1;
	setcookie('julekake', '', time()-3600, '/', '.andebyonline.com');
	setcookie('lukketvalnott', '', time()-3600, '/', '.andebyonline.com');
	header('Location: http://'.$_SERVER['HTTP_HOST']);
}



// Dersom brukeren IKKE har trykket på «Logg ut»-knappen, og det finnes
// informasjon om innloggingsinformasjon i cookies men IKKE i sessions,
// må vi bake småkaker.

elseif (!$_SESSION['utlogga'] && $_COOKIE['julekake'] && !$_SESSION['brukarnamn']) {
	$_SESSION['brukarnamn'] = $_COOKIE['julekake'];
	$_SESSION['krypassord'] = $_COOKIE['lukketvalnott'];
	setcookie('julekake', $_SESSION['brukarnamn'], time()+5184000, '/', '.andebyonline.com');
	setcookie('lukketvalnott', $_SESSION['krypassord'], time()+5184000, '/', '.andebyonline.com');
}



// Nå er all informasjon fra cookies eller innloggingsskjema på plass i
// sessions. Så må den informasjonen tolkes til hvorvidt brukeren er
// innlogget eller ikke ...

// Jeg har av praktiske årsaker en egen variabel som forteller om brukeren er
// logget inn. Den skal i utgangspunktet være 0, altså «ikke innlogget».

$innlogga = 0;



// Nå sjekker vi om det finnes informasjon i sessions om innloggings-
// informasjon. Vi må også sørge for at kodesnutten ikke kjøres dersom
// brukeren har trykket på «Logg ut»-knappen.

if (isset($_SESSION['brukarnamn']) && isset($_SESSION['krypassord']) && $_SESSION['brukarnamn'] && $_SESSION['krypassord'] && !isset($_GET['logout'])) {



	// Sjekk om det finnes en bruker i databasen som har den påloggings-
	// informasjonen som er lagret i sessions. Merk at jeg har lagret
	// alle passord i kryptert format, dersom du ikke gjør dette er det
	// en litt vanskeligere operasjon (men ikke umulig). Denne delen må
	// selvsagt også gjøres helt annerledes dersom du lagrer bruker-
	// informasjon på en annen måte enn MySQL-databaser.

	$query = 'SELECT * FROM brukarar WHERE brnamn=\''.str_replace('\'', '', $_SESSION['brukarnamn']).'\' AND passord=\''.$_SESSION['krypassord'].'\'';
	$result = mysql_query($query);
	$num = mysql_num_rows($result);



	// Dersom det finnes resultater, betyr det at brukeren eksisterer
	// og at passordet stemmer ...

	if ($num == 1) {
		$brukarinfo = mysql_fetch_array($result);



		// ... så da lagrer jeg brukerens id og brukernavn i egne
		// variabler så jeg kan bruke dem i scriptet...

		$brn = stripslashes($brukarinfo['id']);
		$brukarnamn = stripslashes($brukarinfo['brnamn']);



		// ... og endrer «er brukeren innlogget?»-variabelen min
		// til 1.

		$innlogga = 1;



		// Dersom brukeren kommer fra innloggingsskjemaet, og han
		// har haket av for «Husk meg», må brukernavn og kryptert
		// passord lagres i cookies.

		if ($_POST['hugsmeg']) {
			setcookie('julekake', $_SESSION['brukarnamn'], time() + 5184000, '/', '.andebyonline.com');
			setcookie('lukketvalnott', $_SESSION['krypassord'], time() + 5184000, '/', '.andebyonline.com');
		}

		// Her har jeg et par andre funksjoner som det er greit
		// å sjekke på dette tidspunktet i koden i mitt tilfelle
		// -- jeg lagrer tidspunktet akkurat nå i databasen (for
		// å senere kunne vise på skjermen når brukeren sist var
		// aktiv, eller vise «X er pålogget akkurat nå»), og jeg
		// sjekker om brukeren er blokkert og/eller satt i en
		// postekarantene. Disse funksjonene er sannsynligvis
		// ikke av interesse i ditt tilfelle, så jeg viser dem
		// ikke her.
	}
}
?>

Når jeg senere i koden har en funksjon som bare skal være tilgjengelig for innloggede brukere, sjekker jeg bare om ($brn == 1).

Lykke til!
 

halvors

New Member
OK, men hvor skal dette skriptet ligge? i index?

Jeg har nå en fil som heter checklogin.php denne er den loginformet sender deg til og ser slik ut:

<?php
include("settings.php"); //ineholder Mysql inloggingsinfo

mysql_connect("$db_host", "$db_username", "$db_password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

$myusername=stripslashes($myusername);
$mypassword=stripslashes($mypassword);
$myusername=mysql_real_escape_string($myusername);
$mypassword=mysql_real_escape_string($mypassword);

$sql="SELECT * FROM $db_members WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count==1)
{
session_register("myusername");
session_register("mypassword");

header("Location: index.php?lang=$language&page=members");
}
else
{
header("Location: index.php?lang=$language&page=home");
}
?>

hvor passer det og legge inn dit skript?

halvor
 
Du kan selvsagt ikke bruke scriptet mitt ordrett, det var bare et eksempel.

Hvor skal du legge inn dette? Det kommer an på hvordan scriptet er bygd opp. Jeg kjører denne i index.php fordi jeg har valgt å ha et innloggingsskjema på alle sidene. Hvor ligger innloggingsskjemaet ditt? på members.php? Det er isåfall sannsynligvis der du må sjekke om cookies er satt.

Når det gjelder å lagre verdier i cookies, kan du gjøre det i checklogin.php:

Kode:
if($count==1)
{ 

setcookie('myusername', $myusername, time() + 60 * 60 * 24 * 30);
setcookie('mypassword', $mypassword, time() + 60 * 60 * 24 * 30);

session_register("myusername");
session_register("mypassword");

header("Location: index.php?lang=$language&page=members");
}
else
{
header("Location: index.php?lang=$language&page=home");
}
?>

Trenger mer informasjon om scriptet ditt for å finne ut hvor du skal sjekke om cookies eksisterer.
 

halvors

New Member
Hei!

Et lite spørsmål, hva skal det stå i loginformet? <form action"index.php">

Loginscriptet ligger i index fila, men loginformet er også i index fila.

Så hvor legger jeg denne?
 
Tja. Du kan prøve å legge denne koden øverst i index.php? (ikke øverst som i over session_start() og sånt, men før du har en sjekk om hvorvidt brukeren er innlogget eller ikke: )

Kode:
if ($_COOKIE['myusername'] && !$_SESSION['myusername']) {
	$_SESSION['myusername'] = $_COOKIE['myusername'];
	$_SESSION['mypassword'] = $_COOKIE['mypassword'];
}

Sa du ikke akkurat at loginscriptet ligger i checklogin.php?
 

halvors

New Member
OK, og med logout skal de vel stå index.php?logout

Ser dette skriptet bra ut?

Nå har jeg et loginform

en sjekk i index.php fila:

if($_COOKIE['myusername'] && !$_SESSION['myusername']) {
$_SESSION['myusername']=$_COOKIE['myusername'];
$_SESSION['mypassword']=$_COOKIE['mypassword'];
}

<?php

include("settings.php");

$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

if(isset($myusername))
$_SESSION['myusername']=$myusername;
if(isset($mypassword))
$_SESSION['mypassword']=$mypassword;

if(isset($_GET['logout']) && $_GET['logout']) {
unset($_SESSION['myusername']);
unset($_SESSION['mypassword']);
$_SESSION['loggedout']=1;
setcookie('myusername', '', time()-3600);
setcookie('mypassword', '', time()-3600);
header("Location: index.php");
}

elseif(!$_SESSION['loggedout'] && $_COOKIE['myusername'] && !$_SESSION['myusername']) {
$_SESSION['myusername']=$_COOKIE['myusername'];
$_SESSION['mypassword']=$_COOKIE['mypassword'];
setcookie('myusername', $_SESSION['myusername'], time()+5184000);
setcookie('mypassword', $_SESSION['mypassword'], time()+5184000);
}

$loggedin=0;

if(isset($_SESSION['myusername']) && isset($_SESSION['mypassword']) && $_SESSION['myusername'] && $_SESSION['mypassword'] && !isset($_GET['logout'])) {

mysql_connect("$db_host", "$db_username", "$db_password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

$query="SELECT * FROM db_members WHERE username=$myusername AND password='$mypassword";
$result=mysql_query($query);
$num=mysql_num_rows($result);

if($num=="1") {

$loggedin="1";

setcookie('myusername', $_SESSION['myusername'], time() + 5184000);
setcookie('mypassword', $_SESSION['mypassword'], time() + 5184000);

}
}
?>
 
Topp