Пишем авторизацию пользователя на PHP. Авторизация через сессии php


Авторизация на сессиях PHP и MySQL -Будни программиста

Итак, как я и обещал, сегодня я расскажу как сделать свою авторизацию используя session, php и mysql. Для начала определимся что такое сессия и чем она отличается от cookie.Session – это механизм, позволяющий однозначно идентифицировать браузер и создающий для этого браузера файл на сервере, в котором хранятся переменные сеанса.Cookies — это механизм хранения данных броузером удаленного компьютера для идентификации возвращающихся посетителей и хранения параметров веб-страниц.Т.е. главное различие это место хранения данных, у сессий на стороне сервера, у куков на стороне клиента, это различие критично. Если украсть у пользователя cookie довольно просто то с сессиями не все так просто. Ну а теперь перейдем к практической части а именно к написанию своей авторизации.Для начала определим имена файлов:

  • config.php — хранит данные для подключения к Базе Данных ( далее БД )
  • functions.php — содержит в себе все функции для работы авторизации
  • join.php — простейший пример регистрации пользователя в системе
  • login.php — служит для входа в систему
  • logout.php — служит для выхода из системы
  • members.php — служит для проверки авторизации ( простейший пример «закрытой» части сайта

Для начала создадим БД и таблицу где будут храниться данные пользователей.

SQL дамп таблицы пользователей

123456

CREATE TABLE users (  id INT(5) NOT NULL AUTO_INCREMENT,  login VARCHAR(15) DEFAULT '0' ,  password VARCHAR(15) DEFAULT '0' ,  PRIMARY KEY (id));

config.php

Что содержит данный файл я уже говорил, поэтому просто приведу его код.

1234567891011121314151617

<?php# Запуск сессииsession_start();# Служит для отладки, показывает все ошибки, предупреждения и т.д.error_reporting(E_ALL);# Подключение файлов с функциямиinclude_once("functions.php");# В этом массиве далее мы будем хранить сообщения системы, т.е. ошибки.$messages=array();# Данные для подключения к БД$dbhost="localhost";$dbuser="database_user";$dbpass="user_password";$dbname="datebase";# Вызываем функцию подключения к БДconnectToDB();?>

functions.php

Самый большой файл из всех в данной статье, содержит все функции. Приведу исходный код а потом прокомментирую каждую функцию.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135

<?php

function connectToDB() {  global $link, $dbhost, $dbuser, $dbpass, $dbname;  ($link = mysql_pconnect("$dbhost", "$dbuser", "$dbpass")) || die("Couldn't connect to MySQL");  mysql_select_db("$dbname", $link) || die("Couldn't open db: $dbname. Error if any was: ".mysql_error() );}

function newUser($login, $password) {  global $link;

  $query="INSERT INTO users (login, password) VALUES('$login', '$password')";  $result=mysql_query($query, $link) or die("Died inserting login info into db.  Error returned if any: ".mysql_error());

  return true;}

function displayErrors($messages) {  print("<b>Возникли следующие ошибки:</b>\n<ul>\n");

  foreach($messages as $msg){    print("<li>$msg</li>\n");  }  print("</ul>\n");}

function checkLoggedIn($status){  switch($status){    case "yes":      if(!isset($_SESSION["loggedIn"])){        header("Location: login.php");        exit;      }      break;    case "no":      if(isset($_SESSION["loggedIn"]) && $_SESSION["loggedIn"] === true ){        header("Location: members.php");      }      break;  }  return true;}

function checkPass($login, $password) {  global $link;

  $query="SELECT login, password FROM users WHERE login='$login' and password='$password'";  $result=mysql_query($query, $link)    or die("checkPass fatal error: ".mysql_error());

  if(mysql_num_rows($result)==1) {    $row=mysql_fetch_array($result);    return $row;  }  return false;}

function cleanMemberSession($login, $password) {  $_SESSION["login"]=$login;  $_SESSION["password"]=$password;  $_SESSION["loggedIn"]=true;}

function flushMemberSession() {  unset($_SESSION["login"]);  unset($_SESSION["password"]);  unset($_SESSION["loggedIn"]);  session_destroy();  return true;}

function field_validator($field_descr, $field_data, $field_type, $min_length="", $max_length="", $field_required=1) {

  global $messages;

  if(!$field_data && !$field_required){ return; }

  $field_ok=false;

  $email_regexp="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|";  $email_regexp.="(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";

  $data_types=array(    "email"=>$email_regexp,    "digit"=>"^[0-9]$",    "number"=>"^[0-9]+$",    "alpha"=>"^[a-zA-Z]+$",    "alpha_space"=>"^[a-zA-Z ]+$",    "alphanumeric"=>"^[a-zA-Z0-9]+$",    "alphanumeric_space"=>"^[a-zA-Z0-9 ]+$",    "string"=>""  );

  if ($field_required && empty($field_data)) {    $messages[] = "Поле $field_descr является обезательным";    return;  }

  if ($field_type == "string") {    $field_ok = true;  } else {    $field_ok = ereg($data_types[$field_type], $field_data);  }

  if (!$field_ok) {    $messages[] = "Пожалуйста введите нормальный $field_descr.";    return;  }

  if ($field_ok && ($min_length > 0)) {    if (strlen($field_data) < $min_length) {      $messages[] = "$field_descr должен быть не короче $min_length символов.";      return;    }  }

  if ($field_ok && ($max_length > 0)) {    if (strlen($field_data) > $max_length) {      $messages[] = "$field_descr не должен быть длиннее $max_length символов.";      return;    }  }}?>

А теперь по порядку

  • function connectToDB() — служит для подключения к базе данных
  • function newUser($login, $password) — служит для создания нового пользователя в системе
  • function displayErrors($messages) — выводит массив ошибок
  • function checkLoggedIn($status) — проверяет авторизацию пользователя.
  • function checkPass($login, $password) — проверяет пользователя по БД во время авторизации
  • function cleanMemberSession($login, $password) — авторизует пользователя
  • function flushMemberSession() — выход, или если вам будет удобнее logout
  • function field_validator($field_descr, $field_data, $field_type, $min_length=»», $max_length=»», $field_required=1) — Валидатор данных, проверяет соответствие полей требованиям системы

Работу каждой функции я описывать не буду, т.к. они довольно простые, в данный момент нас интересует только логика. Если будут вопросы — спрашивайте.

join.php

Итак исходник:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859

<?phpinclude_once("config.php");

checkLoggedIn("no");

$title="страница регистрации";

if(isset($_POST["submit"])){  field_validator("login name", $_POST["login"], "alphanumeric", 4, 15);  field_validator("password", $_POST["password"], "string", 4, 15);  field_validator("confirmation password", $_POST["password2"], "string", 4, 15);

  if(strcmp($_POST["password"], $_POST["password2"])) {

    $messages[]="Ваши пароли не совпадают";  }    $query="SELECT login FROM users WHERE login='".$_POST["login"]."'";

  $result=mysql_query($query, $link) or die("MySQL query $query failed.  Error if any: ".mysql_error());

  if( ($row=mysql_fetch_array($result)) ){    $messages[]="Логин \"".$_POST["login"]."\" уже занят, попробуйте другой.";  }

  if(empty($messages)) {    newUser($_POST["login"], $_POST["password"]);

    cleanMemberSession($_POST["login"], $_POST["password"]);

    header("Location: members.php");

  }}?><html><head><title><?php print $title; ?></title><meta http-equiv="Content-Type" content="text/html; charset=uft-8"></head><body><h2><?php print $title; ?></h2><?phpif(!empty($messages)){  displayErrors($messages);}?><form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="POST"><table><tr><td>Логин:</td><td><input type="text" name="login"value="<?php print isset($_POST["login"]) ? $_POST["login"] : "" ; ?>"maxlength="15"></td></tr><tr><td>Пароль:</td><td><input type="password" name="password" value="" maxlength="15"></td></tr><tr><td>Повторить пароль:</td><td><input type="password" name="password2" value="" maxlength="15"></td></tr><tr><td>&nbsp;</td><td><input name="submit" type="submit" value="Submit"></td></tr></table></form></body></html>

Если кратко описать работу скрипта получится что то вроде:1. Если уже авторизованы пересылаем на members.php ( строка 4 )2. Если существует $_POST[‘submit’] ( если отправили данные с формы ) проверяем поля валидатором, проверяем наличие такого пользователя, если никаких ошибок нет, добавляем нового пользователя, ставим сессию и пускаем на members.php3. Если есть ошибки — выводим4. Выводим форму

login.php

Код:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859

<?phpinclude_once("config.php");

checkLoggedIn("no");

$title="Страница авторизации";

if(isset($_POST["submit"])) {  field_validator("login name", $_POST["login"], "alphanumeric", 4, 15);  field_validator("password", $_POST["password"], "string", 4, 15);  if($messages){    doIndex();    exit;  }

    if( !($row = checkPass($_POST["login"], $_POST["password"])) ) {        $messages[]="Incorrect login/password, try again";    }

  if($messages){    doIndex();    exit;  }

  cleanMemberSession($row["login"], $row["password"]);

  header("Location: members.php");} else {  doIndex();}

function doIndex() {  global $messages;  global $title;?><html><head><title><?php print $title; ?></title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><h2><?php print $title; ?></h2><?phpif($messages) { displayErrors($messages); }?><form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="POST"><table><tr><td>Логин:</td><td><input type="text" name="login"value="<?php print isset($_POST["login"]) ? $_POST["login"] : "" ; ?>"maxlength="15"></td></tr><tr><td>Пароль:</td><td><input type="password" name="password" value="" maxlength="15"></td></tr><tr><td>&nbsp;</td><td><input name="submit" type="submit" value="Submit"></td></tr></table></form></body></html><?php}?>

Во первых тут стоит указать что вывод html и ошибок происходит в функции doIndex() которая вызывается в некоторых случаях, это не очень удобно поэтому кто хочет переписать — милости прошу, лично я сделал это для примера, к каждому проекту я пишу собственную авторизацию и стараюсь не повторяться. Поэтому здесь только пример.А теперь по порядку.1. подключаем конфиг2. если уже авторизованы пересылаем на страницу members.php ( функция checkLoggedIn с параметром no )3. Если отправлена форма, проверяем поля валидатором, если есть ошибки вызываем функцию doIndex(), если пароли не совпадают ставим ошибку, если есть ошибки вызываем функцию doIndex(), если все в порядке ставим сессию и отправляем на members.php, иначе опять вызываем функцию doIndex()4. Функция doIndex() выводит html код, ошибки и форму для авторизации.

logout.php

123456

<?phpinclude_once("config.php");checkLoggedIn("yes");flushMemberSession();header("Location: login.php");?>

Тут все просто:1. Подключаем конфиг2. Проверяем авторизован ли пользователь3. Уничтожаем сессию4. Отправляем пользователя на страницу авторизации

members.php

1234567

<?phpinclude_once("config.php");checkLoggedIn("yes");print("<b>".$_SESSION["login"]."</b>! Добро пожаловать<br>\n");print("Ваш пароль: <b>".$_SESSION["password"]."</b><br>\n");print("<a href=\"logout.php"."\">Выход</a>");?>

Тоже все просто, подключаем конфиг, проверяем авторизован ли и выводи данные пользователя.

Ну вот собственно и все, хотя все довольно просто — пожалуй это самая длинная моя статья в блоге на данный момент. Если что то не понятно — спрашивайте! И если вы нашли ошибки или есть замечания, не молчите 🙂

Теги: function, MySQL, PHP, Авторизация

programmer-weekdays.ru

Пишем авторизацию пользователя на PHP

Совсем недавно я рассказывал, как при помощи PHP написать систему регистрации для своего сайта. Такой же принцип мы использовали и в своём проекте, созданию которого посвящён раздел «Сайт с нуля» на этом блоге (сам проект я покажу вам гораздо позже). Сегодня же я опишу, как написать авторизацию на сайте, используя данные, полученные от пользователя при регистрации. То есть, будет использоваться таблица MySQL, структура которой была описана в статье про регистрацию. Поэтому я настоятельно рекомендую прежде прочитать ту статью, ибо данная статья является её непосредственным продолжением. Авторизация будет работать с использованием сессий и cookie. Также в статье будет рассмотрено несколько приятных дополнений, таких, как «разлогинивание» (выход) и время последней активности пользователя. Итак, приступим…

Для начала необходимо сверстать главную страницу сайта и поместить её в корне сайта в папку template. Для данного урока нам достаточно, чтобы в этом файле была форма ввода логина и пароля, а также кнопка «Вход». Далее приведён код этой формы:

1 2 3 4 5 <form action="/" method="post"> Логин: <input type="text" name="login" /> Пароль: <input type="password" name="password" /> <input type="submit" value="Войти" name="log_in" /> </form>

Файл назовём index.html.

Метод передачи post необходим. Ведь мы не хотим, чтобы при авторизации логин и пароль светились в адресной строке.

Как только форма готова, создадим самый важный файл будущего сайта — главный контроллер, т. е. файл, лежащий в корне сайта — index.php. Именно он и будет запускаться при входе на сайт. На момент написания статьи на нашем проекте код этого файла занимает 92 строки, нам же понадобится пока лишь около 25 строк. Вот его код:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <? include ('lib/connect.php'); //подключаемся к БД include ('lib/module_global.php'); //подключаем файл с глобальными функциями   if($_GET['action'] == "out") out(); //если передана переменная action, «разавторизируем» пользователя   if (login()) //вызываем функцию login, определяющую, авторизирован юзер или нет { $UID = $_SESSION['id']; //если юзер авторизирован, присвоим переменной $UID его id $admin = is_admin($UID); //определяем, админ ли юзер } else //если пользователь не авторизирован, то проверим, была ли нажата кнопка входа на сайт { if(isset($_POST['log_in'])) { $error = enter(); //функция входа на сайт if (count($error) == 0) //если нет ошибок, авторизируем юзера { $UID = $_SESSION['id']; $admin = is_admin($UID); } } } include ('tpl/index.html'); //подключаем файл с формой ?>

Теперь более подробно разберёмся, как всё это работает.

В первых трёх строках мы просто подключаем файлы с функциями, которые будем использовать далее в коде. О них чуть позже. Далее проверим, был ли передан get-параметр action=out. Если он был передан, значит пользователь нажал на ссылку выхода с сайта. Вот, кстати, код этой ссылки. Добавьте его в файл с кодом формы для входа.

<a href="/?action=out">Выход</a>

Саму функцию, как и все остальные, рассмотрим позже. Сперва логика…

Далее идёт условие, проверяющее авторизирован ли ты (if (login())). Функция возвращает true в случае, если пользователь вошёл на сайт и false в противном случае. Если вернулось true, записываем в переменную $UID id юзера, а в переменную $admin — результат работы функции is_admin($UID). Данная функция определяет, является ли пользователь администратором и возвращает true, если юзер — админ и false в противном случае. В дальнейшем две эти переменные будут необходимы для вывода определённых элементов на странице. Так, следующим условием можно вывести форму авторизации:

1 2 3 4 5 6 7 8 9 10 <? If($UID) //если переменной нет, выводим форму {?> <form action="/" method="post"> Логин: <input type="text" name="login" /> Пароль: <input type="password" name="password" /> <input type="submit" value="Войти" name="log_in" /> </form> <?} ?>

Аналогично и с переменной $admin. Кстати, последний код можно включить в файл с формой.Если же функция login() вернёт false, т. е. пользователь не вошёл на сайт, проверим, нажал ли он на кнопку входа на сайт в форме авторизации:

if(isset($_POST['log_in']))

Если да, запускаем функцию enter(), авторизирующую пользователя. Если ошибок не произойдёт и юзер успешно вошёл, создадим те же 2 переменные: $UID и $admin. В противном случае никакие переменные не создаются – пользователь является гостем. Алгоритм работы представлен на следующей схеме:

Теперь разберёмся со всеми функциями, вызываемыми в данном коде. В первую очередь опишу функцию входа на сайт:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 function enter () { $error = array(); //массив для ошибок if ($_POST['login'] != "" && $_POST['password'] != "") //если поля заполнены { $login = $_POST['login']; $password = $_POST['password']; $rez = mysql_query("SELECT * FROM users WHERE login=$login"); //запрашиваем строку из БД с логином, введённым пользователем if (mysql_num_rows($rez) == 1) //если нашлась одна строка, значит такой юзер существует в БД { $row = mysql_fetch_assoc($rez); if (md5(md5($password).$row['salt']) == $row['password']) //сравниваем хэшированный пароль из БД с хэшированными паролем, введённым пользователем и солью (алгоритм хэширования описан в предыдущей статье) { //пишем логин и хэшированный пароль в cookie, также создаём переменную сессии setcookie ("login", $row['login'], time() + 50000); setcookie ("password", md5($row['login'].$row['password']), time() + 50000); $_SESSION['id'] = $row['id']; //записываем в сессию id пользователя $id = $_SESSION['id']; lastAct($id); return $error; } else //если пароли не совпали { $error[] = "Неверный пароль"; return $error; } } else //если такого пользователя не найдено в БД { $error[] = "Неверный логин и пароль"; return $error; } }   else { $error[] = "Поля не должны быть пустыми!"; return $error; } }

Первым делом, функция проверяет, заполнил ли пользователь поля для ввода логина и пароля. Если да — продолжаем работу программы, если нет — пишем в массив $error текст ошибки и возвращаем его в основную программу, которая, узнав размерность полученного массива, не авторизирует пользователя.Если же работа функции enter() продолжится, проверим, существует ли в БД запись с таким ником, какой ввёл юзер. Если такой записи не оказалось, вернём опять же массив с соответствующей ошибкой. Если в БД есть один пользователь с таким ником, сравним введённый пароль с паролем, хранящимся в базе данных и соответствующим нашему нику.

Сравниваем мы пароли не в чистом виде. Ведь в БД они хранятся хэшированными функцией md5(). Поэтому, прежде чем сравнивать их, необходимо тем же алгоритмом хэшировать и введённый пользователем при авторизации пароль. Если хэши совпадут, значит логин и пароль совпали и скрипт авторизирует пользователя. Если совпадения не произошло, вернём ошибку.

Теперь объясню, что же значит «авторизироваться». В данном скрипте данные об авторизации хранятся в сессии и cookie. В сессию записываем id пользователя:

И создаём два cookie: login и password с продолжительностью жизни — 50000 секунд. В первый пишем логин, а во второй — хэш пароля.

В этой строке мы выполняем функцию, отвечающую за установку времени последней активности юзера. Вот код этой функции:

1 2 function lastAct($id) { $tm = time(); mysql_query("UPDATE users SET online='$tm', last_act='$tm' WHERE"); }

Функция перезаписывает поля online и last_act в БД. Кстати, предварительно, необходимо убедиться в существовании этих полей. Оба они имеют тип int.

Алгоритм работы функции enter() приведён на следующей иллюстрации:

Следующая функция отвечает за проверку, авторизирован ли пользователь на сайте или нет — login().

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 function login () { ini_set ("session.use_trans_sid", true); session_start(); if (isset($_SESSION['id']))//если сесcия есть { if(isset($_COOKIE['login']) && isset($_COOKIE['password'])) //если cookie есть, то просто обновим время их жизни и вернём true { SetCookie("login", "", time() - 1, '/'); SetCookie("password","", time() - 1, '/'); setcookie ("login", $_COOKIE['login'], time() + 50000, '/'); setcookie ("password", $_COOKIE['password'], time() + 50000, '/'); $id = $_SESSION['id']; lastAct($id); return true; } else //иначе добавим cookie с логином и паролем, чтобы после перезапуска браузера сессия не слетала { $rez = mysql_query("SELECT * FROM users WHEREid']}'"); //запрашиваем строку с искомым id if (mysql_num_rows($rez) == 1) //если получена одна строка { $row = mysql_fetch_assoc($rez); //записываем её в ассоциативный массив setcookie ("login", $row['login'], time()+50000, '/'); setcookie ("password", md5($row['login'].$row['password']), time() + 50000, '/'); $id = $_SESSION['id']; lastAct($id); return true; } else return false; } } else //если сессии нет, то проверим существование cookie. Если они существуют, то проверим их валидность по БД { if(isset($_COOKIE['login']) && isset($_COOKIE['password'])) //если куки существуют. { $rez = mysql_query("SELECT * FROM users WHERE login='{$_COOKIE['login']}'"); //запрашиваем строку с искомым логином и паролем @$row = mysql_fetch_assoc($rez); if(@mysql_num_rows($rez) == 1 && md5($row['login'].$row['password']) == $_COOKIE['password']) //если логин и пароль нашлись в БД { $_SESSION['id'] = $row['id']; //записываем в сесиию id $id = $_SESSION['id']; lastAct($id); return true; } else //если данные из cookie не подошли, то удаляем эти куки, ибо нахуй они такие нам не нужны { SetCookie("login", "", time() - 360000, '/'); SetCookie("password", "", time() - 360000, '/'); return false; } } else //если куки не существуют { return false; } } }

Почему для авторизации мы будем использовать и COOKIE и сессию? Дело в том, что после закрытия браузера, сессия «умирает» и пользователь автоматически разлогинивается. Cookie же хранятся определённое, задаваемое нами, время. В данном случае это 50000 секунд.

Итак, разберёмся, как же эта функция работает. Её стоит запускать первой на всех страницах и модулях будущего сайта. Во-первых, она проверяет, авторизирован ли пользователь, что для дальнейшей работы скрипта крайне важно. Во-вторых, она обновляет время последней активности пользователя, а также поможет в будущем ввести систему онлайн-пользователей.

Функция вернёт true, если юзер авторизирован и false в противном случае. Пичём, в процессе её работы, будет обновлено время жизни cookie, а также они будут созданы, если не существуют.

Лучше всего работу функции online описывает эта иллюстрация:

Если есть сессия и cookie, мы обновляем время жизни cookie. Для этого мы их удаляем, устанавливая время смерти на одну секунду раньше текущего момента времени, а затем устанавливаем заново. Также функцией lastAct() обновлем время последней активности. Возвращаем true.

Если же сессия есть, а cookie по какой-то причине не оказалось, то по id пользователя получаем из БД логин и хэш пароля и пишем их в cookie. Возвращаем true.

Если нет сессии, проверим, быть может существуют cookie. Классический пример авторизации после перезапуска браузера — сессия слетела, но cookie-то живы. Тут уже сложнее, мы должны проверить, совпадает ли пара логин-пароль с какой-либо строкой из БД. Ведь юзер мог заменить в настройках для сайта cookie ручками или написать любую чушь. Если такая пара нашлась, создаём переменную сессии и возвращаем true. Если же пара не найдена, посылаем пользователя на йух и возвращаем false.

Последний, самый печальный вариант — когда ни сессии, ни cookie не оказалось… Возвращаем false.

Теперь обратим взор на функцию is_admin($UID). Она определяет, является ли юзер администратором сайта. Возможно, вам это не нужно, тогда можете опустить эту функцию и все её вызовы в контроллере. Но она может быть полезна для вывода какого либо контента на страницу, предназначенного для администраторов, а не для обычных пользователей. Функция простая и основана на ещё одном созданном столбце в БД в таблице users. Столбец называем prava. Тип int. Если юзер является обыкновенным пользователем, то присваиваем значению в этом столбце 0, если же этот юзер — админ, то присваиваем единицу. Следующая функция и определяет, что стоит в столбце prava; если единица, то возвращается true (пользователь – админ), иначе false.

1 2 3 4 5 6 7 8 9 10 function is_admin($id) { @$rez = mysql_query("SELECT prava FROM users WHERE"); if (mysql_num_rows($rez) == 1) { $prava = mysql_result($rez, 0); if ($prava == 1) return true; else return false; } else return false; }

Ну и последняя, на самом деле очень лёгкая, функция — out(). Принцип её работы прост — удалить все «следы» пользователя – сессию и cookie.

1 2 3 4 5 6 7 8 function out () { session_start(); $id = $_SESSION['id']; mysql_query("UPDATE users SET online=0 WHERE"); //обнуляем поле online, говорящее, что пользователь вышел с сайта (пригодится в будущем) unset($_SESSION['id']); //удаляем переменную сессии SetCookie("login", ""); //удаляем cookie с логином SetCookie("password", ""); //удаляем cookie с паролем header('Location: http://'.$_SERVER['HTTP_HOST'].'/'); //перенаправляем на главную страницу сайта }

Код всех описанных функций помещаем в файл lib/module_global.php, который подключается в самом начале работы контроллера.

Таким образом, мы написали простую, однако достаточно функциональную регистрацию для своего будущего сайта. В придачу ко всему мы заложили некоторый фундамент для ещё не рассмотренных возможностей: администрирование, онлайн-пользователи, время последней активности. Также авторизация не будет слетать после перезапуска браузера, что достигнуто путём использования cookie. Кроме этого мы предусмотрели и выход с сайта.

В следующем уроке я опишу, как при помощи уже написанной системы авторизации можно будет создать нечто вроде собственного блога, с добавлением сообщений и постраничной навигацией.

Чтобы не пропустить следующие статьи, подпишитесь на RSS.

Удачи и до следующих статей.

true-coder.ru

Авторизация через сессии

Вопрос: Авторизация через ВКонтакте

Здравствуйте, форумчане. Бродил я по интернету, искал, пересмотрел кучу видео, но полезной информации 0. Проблема в следующем : у меня есть десктопное приложение, и я хочу для него сделать авторизацию через вк. Приложение создано, оно есть в вк, ID приложения есть. Строку, по которой нужно перенаправлять пользователя для данной авторизации я тоже нашел. Я делал так, создавал объект webBrowser (новая форма для этого всплывает), оно проходит авторизацию, то есть выбивает мне окошко ввода логин пароля, потом разрешение доступа к информации вконтакте, затем выводит следующее : "Пожалуйста, не копируйте данные из адресной строки для сторонних сайтов. Таким образом Вы можете потерять доступ к Вашему аккаунту." А дальше что делать, я понять не могу. Я пытался извлечь из браузера url после этого всего (ту, как я думал, заветную адресную строку), но оно имеет значение null. Как мне получить access token? Может быть кто-то писал приложения для ВК? МНе всего нужно получить ID, Имя пользователя, пол и т.п. К стенам всяким мне доступ не нужен. Буду признателен за подсказки или полезные ссылочки.

Добавлено через 15 минут Нашёл как открыть стандартный браузер, и сделать всё там

C#
1 Process.Start("https://oauth.vk.com/authorize?client_id=5527856&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.52");
Но как извлечь данные? Я вероятно делаю что-то не так Так, как оказалось, все данные появились в адресной строке стандартного браузера Теперь, как извлечь URL из этого браузера? Ну а дальше дело не хитрое, пропарсить и поделом)

Добавлено через 2 часа 49 минутТак-с, нашёл, люди пишут что нужно юзать UI Automation, но как его юзать - не пишут, может кто-то подскажет? Вопрос всё ещё актуален

Добавлено через 8 часов 51 минутуUp.

Добавлено через 1 час 34 минутыРешил проблему, всем спасибо

forundex.ru