За последние 24 часа нас посетили 17485 программистов и 1720 роботов. Сейчас ищут 1528 программистов ...

Регистрация / Авторизация - на легкой основе

Тема в разделе "PHP для новичков", создана пользователем MouseZver, 30 окт 2017.

  1. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    В общем, буду краток. Входу - готовый код с примером.
    Честно.. сразу 4 действия главных будут:
    1. Регистрация
    2. Авторизация
    3. Выход из системы ( превращаешься в лалку )
    4. Идентификация юзера
    Без стилей ( почти, наверно... постараюсь )... чисто демонстрация.
    Начнем с главного .htaccess:
    Код (Text):
    1. AddDefaultCharset UTF-8
    2.  
    3. DirectoryIndex index.php
    4.  
    5. RewriteEngine On
    6.  
    7. # Redirect Trailing Slashes If Not A Folder...
    8. RewriteCond %{REQUEST_FILENAME} !-d
    9. RewriteRule ^(.*)/$ /$1 [L,R=301]
    10.  
    11. # Handle Front Controller...
    12. RewriteCond %{REQUEST_FILENAME} !-d
    13. RewriteCond %{REQUEST_FILENAME} !-f
    14. RewriteRule ^ index.php [L]
    Не создается ? блокнотом сохранить без имени. notepad++

    Дальше index.php:
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. use Aero\Lerma;
    6.  
    7. require 'Aero/AeroBase.php';
    8.  
    9. # Start...
    10. ( $main = new Aero\Application\Main( __DIR__ ) ) -> send();
    11.  
    12. $main -> runable( $main -> make( Aero\Supports\Auth::class, [ Aero\Configures\Auth::class ] ) );
    13.  
    14.  
    15. # ----------
    16.  
    17.  
    18. $pages = [ 'auth', 'reg', 'logout' ];
    19.  
    20. if ( !empty ( $uri = trim ( parse_url ( $_SERVER['REQUEST_URI'], 5 ), '/' ) ) )
    21. {
    22.     require Aero::Separator( ( in_array ( $uri, $pages ) ? [ '/resources/pages/%s.php', $uri ] : '/resources/view/pages/404.php' ) );
    23. }
    24. else
    25. {
    26.     require Aero::Separator( '/resources/view/pages/default.php' );
    27. }
    • отображаем сразу все ошибки чтобы не нубить..
    • Подключение ядра AeroBase
    • Запуск библиотек..
    • Мини недоРоутер
    --------------------------------------

    Теперь создаем папки:
    1. Aero
    2. public
    3. resources
    В папке Aero будет находится ядро системы для нашей демонстрации
    Создаем там файл AeroBase.php:
    PHP:
    1. <?php
    2.  
    3. namespace Aero
    4. {
    5.     class AeroBase
    6.     {
    7.         public static $app;
    8.         protected static $NAMESPACESMAP =
    9.         [
    10.             Interfaces\LermaDrivers::class    => 'Interfaces\Lerma\IDrivers',
    11.             Lerma::class                    => 'Supports\Lerma\Lerma'
    12.         ];
    13.        
    14.         public static function autoload( string $autoload )
    15.         {
    16.             if ( isset ( self::$NAMESPACESMAP[$autoload] ) )    # Преобразование загруженной директории из имени пространства
    17.            {
    18.                 $autoload = self::$NAMESPACESMAP[$autoload];
    19.             }
    20.             elseif ( !file_exists ( ( $autoload = substr ( __DIR__, 0, -4 ) . $autoload ) . '.php' ) )
    21.             {
    22.                 throw new \Exception( '~~ Invalid namespace ' . $autoload );
    23.             }
    24.            
    25.             include strtr ( $autoload, '\\', DIRECTORY_SEPARATOR ) . '.php';
    26.         }
    27.         public static function Separator( $path )
    28.         {
    29.             return strtr ( self::$app -> Directory . ( is_array ( $path ) ? sprintf ( ...$path ) : $path ), '/', DIRECTORY_SEPARATOR );
    30.         }
    31.     }
    32. }
    33.  
    34. namespace
    35. {
    36.     final class Aero extends Aero\AeroBase {}
    37.    
    38.     spl_autoload_register ( [ Aero::class, 'autoload' ] );
    39. }
    • Два пространства в одном файле. Не стоит говорить что это "писец". Так задумано.
    • Автозагрузка классов.
    • Добрый Сепка.
    --------------------------------------

    Идем в интернет и скачиваем папочки с содержимым:
    • Lerma - Библиотека для работы с базой данных.
    • Auth - Процедура Идентификация пользователей
    Все закачали, заменить - да, готово! Папочки и файлик..
    Один из главных компонентов...
    Application/Main.php... да, да создавай папку с файлом!
    PHP:
    1. <?php
    2.  
    3. namespace Aero\Application;
    4.  
    5. use Aero;
    6.  
    7. class Main
    8. {
    9.     # loads components
    10.    public $components = [];
    11.     # public $buffer;
    12.    public $Directory;
    13.     #public $htmlPath;
    14.    #public $pagePath;
    15.  
    16.     public function __construct ( string $Directory )
    17.     {
    18.         Aero::$app = $this;
    19.        
    20.         $this -> Directory = $Directory;
    21.     }
    22.     public function __get( $name )
    23.     {
    24.         if ( isset ( $this -> $name ) )
    25.         {
    26.             return $this -> $name;
    27.         }
    28.         if ( isset ( $this -> components[$name] ) )
    29.         {
    30.             return $this -> components[$name];
    31.         }
    32.        
    33.         throw new \Exception( '~~ Invalid get parameter ' . $name );
    34.     }
    35.     public function make( string $name, array $parameters = [] )
    36.     {
    37.         $explode = explode ( '\\', $name );
    38.        
    39.         return $this -> components[end ( $explode )] = new $name( ...$parameters );
    40.     }
    41.     public function send()
    42.     {
    43.         $this -> header();
    44.        
    45.         register_shutdown_function ( [ $this, 'view' ] );
    46.     }
    47.     public function runable( ...$args )
    48.     {
    49.         foreach ( $args AS $arg )
    50.         {
    51.             $arg -> run();
    52.         }
    53.     }
    54.     protected function header()
    55.     {
    56.         session_name ( 'EASYSINGLE_SESSID' );
    57.         session_start ();
    58.        
    59.         ob_start ();
    60.     }
    61.     public function view()
    62.     {
    63.         $contents = ob_get_contents ();
    64.         ob_end_clean ();
    65.        
    66.         include Aero::Separator( '/resources/view/template.php' );
    67.     }
    68. }

    Выходим с Aero...
    --------------------------------------
    И заходим в resources. Создаем ветки папок:
    1. resources\pages - будут находиться файлы которые относятся к недоРоутеру.
    2. resources\view\pages - тут мы и остановимся в ней. html содержимое.
    Отдышались...
    И поехали создавать файлики...
    404.php
    HTML:
    1. Страница не найдена
    Authform.php - Форма авторизации
    HTML:
    1. <div class="RAY_WRAPPER_REGISTER">
    2.     <form action="/auth" method="POST">
    3.         <input type="text" name="<?= Aero::$app -> Auth -> form -> email ?>" placeholder="Email">
    4.         <input type="password" name="<?= Aero::$app -> Auth -> form -> pass ?>" placeholder="Password">
    5.         <button type="submit">AuthMe</button>
    6.     </form>
    7. </div>
    Regform.php - Форма регистрации
    PHP:
    1. <div class="RAY_WRAPPER_REGISTER">
    2.     <form action="/reg" method="POST">
    3.         <div class="REGISTER-ONE-STEP REGISTER-VISIBLE">
    4.             <input type="text" name="<?= Aero::$app -> Auth -> form -> name ?>" placeholder="Username">
    5.             <input type="text" name="<?= Aero::$app -> Auth -> form -> email ?>" placeholder="Email">
    6.             <input type="password" name="<?= Aero::$app -> Auth -> form -> pass ?>" placeholder="Password">
    7.             <input type="password" name="<?= Aero::$app -> Auth -> form -> confirm ?>" placeholder="Retype password">
    8.             <button type="submit">Register</button>
    9.         </div>
    10.     </form>
    11. </div>
    default.php - Дефолт, стартовая страница
    PHP:
    1. <p>Привет <?= Aero::$app -> Auth -> username ?>!</p>
    2.  
    3. <? if ( Aero::$app -> Auth -> isLogged ) { ?>
    4.     <p>Ты авторизован</p>
    5.     <p>Нажми на кота чтобы выйти!
    6.     <br>
    7.     <a href="/logout"><img src="/public/images/logout.png"></a>
    8. <? } else { ?>
    9.     <p><a href="/auth">Авторизация</a></p>
    10.     <p><a href="/reg">Регистрация</a></p>
    11. <? }
    выходим из этой папки и создаем шаблон файл.
    resources\view\template.php
    HTML:
    1. <!DOCTYPE html>
    2.     <head>
    3.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    4.         <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    5.         <title>test</title>
    6.         <link type="text/css" rel="stylesheet" href="/public/css/style.css">
    7.     </head>
    8.     <body class="BORDER_RED">
    9.         <?= $contents . PHP_EOL ?>
    10.     </body>
    11. </html>
    снова выходи выше..
    и заглядываем в pages
    --- Добавлено ---
    Создаем наши странички ( site/auth ):
    auth.php
    PHP:
    1. <?php
    2.  
    3. use Aero\Lerma;
    4.  
    5. if ( Aero::$app -> Auth -> isLogged )
    6. {
    7.     header ( 'Location: /?no' );
    8.     exit;
    9. }
    10.  
    11. if ( $_SERVER['REQUEST_METHOD'] === 'POST' )
    12. {
    13.     $ARGS = [
    14.         Aero::$app -> Auth -> form -> email => FILTER_VALIDATE_EMAIL,
    15.         Aero::$app -> Auth -> form -> pass => FILTER_DEFAULT
    16.     ];
    17.    
    18.     $error = [];
    19.  
    20.     $INPUTS = filter_input_array ( INPUT_POST, $ARGS );
    21.  
    22.     if ( in_array ( NULL, $INPUTS, TRUE ) )
    23.     {
    24.         $error['undefined'] = 'Undefined inputs name :(';
    25.     }
    26.     elseif( !$INPUTS[Aero::$app -> Auth -> form -> email] )
    27.     {
    28.         $error['email'] = 'Invalid is email.';
    29.     }
    30.     else
    31.     {
    32.         $lerma = Lerma::prepare( [ 'SELECT id, username, password FROM %s WHERE email = ?',
    33.             Aero::$app -> Auth -> form -> table
    34.         ], [ strtolower ( $INPUTS[Aero::$app -> Auth -> form -> email] ) ] );
    35.        
    36.         if ( $lerma -> rowCount() == 0 OR !password_verify ( $INPUTS[Aero::$app -> Auth -> form -> pass], ( $account = $lerma -> fetch( Lerma::FETCH_OBJ ) ) -> password ) )
    37.         {
    38.             $error['data'] = 'Введенные данные не верны.';
    39.         }
    40.     }
    41.  
    42.     if ( !empty ( $error ) )
    43.     {
    44.         echo implode ( '<br>', $error );
    45.     }
    46.     else
    47.     {
    48.         $password_hash = password_hash ( $INPUTS[Aero::$app -> Auth -> form -> pass], PASSWORD_DEFAULT );
    49.        
    50.         $hash = md5 ( $account -> id . $account -> username . $password_hash );
    51.        
    52.         Lerma::query( [ 'UPDATE %s SET password = "%s", hash = "%s", online = %d WHERE id = %d',
    53.             Aero::$app -> Auth -> form -> table,
    54.             $password_hash,
    55.             $hash,
    56.             $_SERVER['REQUEST_TIME'],
    57.             $account -> id
    58.         ] );
    59.        
    60.         setcookie ( Aero::$app -> Auth -> data -> cookie, $hash, strtotime ( Aero::$app -> Auth -> data -> time ), '/' );
    61.        
    62.         header ( 'Location: /?' . $account -> username );
    63.         exit;
    64.     }
    65. }
    66.  
    67. require Aero::Separator( '/resources/view/pages/Authform.php' );
    --- Добавлено ---
    ( site/reg )
    reg.php

    ( site/logout )
    logout.php

    https://github.com/MouseZver/My-garbage-code/tree/master/php.ru/64708/66872

    Сволочи не помещаются сюда....


    Осталось чуть чуть...
    Заходим в папку public (находится в корне каталогов)
    Создаем папу css и images.
    css стиль кидаем куда надо.
     
    Dimon2x и acso нравится это.
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    style.css
    Код (CSS):
    1. @charset "utf-8";
    2.  
    3. /* body, form, ul, li, p, h1, h2, h3, h4, h5, h6
    4. {
    5.     margin: 0;
    6.     padding: 0;
    7. } */
    8. ui, li
    9. {
    10.     list-style: none;
    11. }
    12. h1, h2, h3, h4, h5, h6
    13. {
    14.     font-size: 100%;
    15.     font-weight: normal;
    16. }
    17. body
    18. {
    19.     font: normal 13px/17px Tahoma, "Trebuchet MS", Helvetica, sans-serif;
    20.     color: #000;
    21. }
    22. .RAY_WRAPPER_REGISTER form
    23. {
    24.     width: 390px;
    25. }
    26. .RAY_WRAPPER_REGISTER input[type="text"], .RAY_WRAPPER_REGISTER input[type="password"]
    27. {
    28.     font-size: .9em;
    29.     width: 100%;
    30.     height: 32px;
    31.     box-sizing: border-box;
    32.     padding: 5px 10px;
    33.     margin-bottom: 10px;
    34. }
    Закончили...

    Идем создаем таблицу users.
    запрос тык:
    PHP:
    1. CREATE TABLE `users` (
    2.   `id` int(11) NOT NULL,
    3.   `username` text NOT NULL,
    4.   `email` text NOT NULL,
    5.   `password` text NOT NULL,
    6.   `status` int(2) NOT NULL DEFAULT '1',
    7.   `datareg` int(11) NOT NULL,
    8.   `online` int(11) NOT NULL,
    9.   `hash` text
    10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    11. ALTER TABLE `users`
    12.   ADD PRIMARY KEY (`id`);
    13. ALTER TABLE `users`
    14.   MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
    Дальше лезем в настройки:
    Aero\Configures\Lerma.php
    Указываем к какой бд законектимся..
    'dbname' => 'сюда',

    ну и логин и т.д.

    Херас там!
    [​IMG]
    скачай кота и засунь в папку с изображениями на память!

    API - кто в танке:
    1. Aero::$app -> Auth -> username - Никнейм юзера.
    2. Aero::$app -> Auth -> status - По дефолту пользователям присваевается при регистрации единица. Тоесть - обычный пользователь.
    3. Aero::$app -> Auth -> isLogged - булевое значение Пользователь или Гость.
    Чет оказалось не на легкой основе .. :rolleyes:
    P.s: некие места в основе потерпели к велоизобретению =(
    Ничего вроде не забыл...
     
    acso нравится это.
  3. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Интересный подход, но чересчур "не на легкой основе", хотя мысли и код, в принципе, понятны)
     
  4. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Как же csrf?
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    не предусмотрено, так как в это направление абстрактно лишь проходил. По русски: нет знаний чтобы создать виртуальность этой атаки на свой же код.
     
    AlexProg нравится это.
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    Обновил:

    Библиотеку Аутентификации, добавив csrf
    Проверка токенов в двух файлов
    1. resources\pages\auth.php
    2. resources\pages\reg.php

    ну и соответственно формы для активации csrf:

    resources\view\pages\Authform.php
    HTML:
    1. <div class="RAY_WRAPPER_REGISTER">
    2.     <form action="/auth" method="POST">
    3.         <input type="text" name="<?= Aero::$app -> Auth -> form -> email ?>" placeholder="Email">
    4.         <input type="password" name="<?= Aero::$app -> Auth -> form -> pass ?>" placeholder="Password">
    5.         <input type="hidden" name="<?= Aero::$app -> Auth -> form -> csrf -> name ?>" value="<?= Aero::$app -> Auth -> csrf ?>">
    6.         <button type="submit">AuthMe</button>
    7.     </form>
    8. </div>
    resources\view\pages\Regform.php
    HTML:
    1. <div class="RAY_WRAPPER_REGISTER">
    2.     <form action="/reg" method="POST">
    3.         <div class="REGISTER-ONE-STEP REGISTER-VISIBLE">
    4.             <input type="text" name="<?= Aero::$app -> Auth -> form -> name ?>" placeholder="Username">
    5.             <input type="text" name="<?= Aero::$app -> Auth -> form -> email ?>" placeholder="Email">
    6.             <input type="password" name="<?= Aero::$app -> Auth -> form -> pass ?>" placeholder="Password">
    7.             <input type="password" name="<?= Aero::$app -> Auth -> form -> confirm ?>" placeholder="Retype password">
    8.             <input type="hidden" name="<?= Aero::$app -> Auth -> form -> csrf -> name ?>" value="<?= Aero::$app -> Auth -> csrf ?>">
    9.             <button type="submit">Register</button>
    10.         </div>
    11.     </form>
    12. </div>
    --- Добавлено ---
    API +
    • Aero::$app -> Auth -> csrf - регистрирует и выдает токен
    • Aero::$app -> Auth -> form -> csrf -> name - выводит идентификатор индекса csrf
     
    AlexProg нравится это.
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    А можно без рельмы пример?
     
  8. teleoperator

    teleoperator Зэк
    [ БАН ]

    С нами с:
    3 июл 2017
    Сообщения:
    107
    Симпатии:
    29
    Тебе покодить или повыпендриваться? Дали тебе пример, дальше юзай как хошь...
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    скрипты заточены под лерму, сменить всегда можно
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    @ тема сгнила, либы перезаточены, и ссылки битые