Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

Счётчик запросов 20-25ч 250$

/**

* Функционал позволяющий отследить закрытие окна браузера и деавторизовать пользователя.

* Используются keepalive посылки.

* Иных способов отследить закрытие окна браузера НЕТ.

* window.onunload = function() сработает и при переходе на другой URL или отправке формы.

*

*/

NG_Core::add_page_assets( 'auth_keepalive_code' );

function auth_keepalive_code() {

if ( ! is_user_logged_in() ) {

return;

}

$interval = (int) floor( USER_INVALIDATE_AFTER / 3 ) * 1000;

?>

}

NG_Ajax::add_ajax_handler( 'keepalive', function () {

if ( NG_User::update_auth_cookies() ) {

echo 'I hear you.';

return;

}

header( 'HTTP/1.0 403 Access Forbidden', true, 403 );

echo 'Nope!';

} );

/**

* Class NG_User

*

* Авторизация пользователя. Сессии пользователя.

*

*

*/

class NG_User {

private static $user_id = false;

private static $auth_callback = null;

private static $pass = '';

static function determine_user() {

// Logging in

if ( cm_is_auth_request()

&& cm_is_http_post() ) {

if ( ( $name = cm_get_post( 'name', '[\wа-я]+' ) )

&& ( $pass = cm_get_post( 'pass' ) ) ) {

if ( ! self::authenticate_user( $name, $pass ) ) {

ng_add_error_notice( 'Неверный пароль или имя пользователя.' );

return false;

}

else {

NG_Core::do_action( 'authenticated', self::$user_id );

}

}

// No further processing is needed

header( "Location: " . ng_get_site_url(), true );

exit;

}

if ( ! empty( self::$user_id ) ) {

return self::$user_id;

}

// Determining logged-in user

self::$user_id = false;

if ( ( $sid = cm_get_cookie( USER_AUTH_COOKIE_UID ) )

&& ( $hash = cm_get_cookie( USER_AUTH_COOKIE_HASH ) )

&& ( $expires = cm_get_cookie( USER_AUTH_COOKIE_EXPIRES ) )

&& ( $ka = cm_get_cookie( USER_AUTH_COOKIE_KEEPALIVE ) ) ) {

if ( hash_equals( $hash, self::create_hash( array( $sid, $expires, $ka ) ) ) ) {

if ( $expires

|| $ka

self::logout();

return false;

}

self::$user_id = $sid;

/*if ( USER_AUTH_SAVE_PWD ) {

self::$pass = cm_array_get( $_SESSION, 'pass' );

if ( ! self::$pass ) {

self::$user_id = false;

}

}*/

}

}

// Logging out

if ( cm_is_auth_request()

&& ! cm_is_http_post()

&& ( 'logout' == cm_array_get( $_GET, 'action' ) ) ) {

self::logout();

}

return self::$user_id;

}

static function authenticate_user( $user_name, $pass ) {

if ( ! is_callable( self::$auth_callback ) ) {

return false;

}

if ( self::$user_id = call_user_func( self::$auth_callback, $user_name, $pass ) ) {

//setcookie( USER_AUTH_COOKIE_UID, $user_name, time() + USER_AUTH_VALID, '/' );

//setcookie( USER_AUTH_COOKIE_HASH, self::user_hash( $user_name ), time() + USER_AUTH_VALID, '/' );

self::set_auth_cookies( $user_name );

self::$pass = $pass;

/*if ( USER_AUTH_SAVE_PWD ) {

$_SESSION['pass'] = $pass;

}*/

}

return self::$user_id;

}

static function set_auth_cookies( $user_name ) {

$expire = time() + USER_AUTH_VALID;

setcookie( USER_AUTH_COOKIE_EXPIRES, $expire, $expire, '/' );

setcookie( USER_AUTH_COOKIE_UID, $user_name, $expire, '/' );

$ka = time() + USER_INVALIDATE_AFTER;

setcookie( USER_AUTH_COOKIE_KEEPALIVE, $ka, $expire, '/' );

setcookie( USER_AUTH_COOKIE_HASH, self::create_hash( array( $user_name, $expire, $ka ) ), $expire, '/' );

}

static function update_auth_cookies() {

if ( ! self::determine_user() ) {

false;

}

$user_name = cm_get_cookie( USER_AUTH_COOKIE_UID );

$expire = cm_get_cookie( USER_AUTH_COOKIE_EXPIRES );

if ( ! $user_name

|| ! $expire ) {

return false;

}

$ka = time() + USER_INVALIDATE_AFTER;

setcookie( USER_AUTH_COOKIE_KEEPALIVE, $ka, $expire, '/' );

setcookie( USER_AUTH_COOKIE_HASH, self::create_hash( array( $user_name, $expire, $ka ) ), $expire, '/' );

return true;

}

/**

* @param array $params

*

* @return string

*/

static function create_hash( $params ) {

return hash( 'sha512', implode( '|', $params ) . USER_AUTH_SALT );

}

/**

* @param $callback

*

* @return bool

*/

static function add_authenticator( $callback ) {

if ( is_callable( $callback ) ) {

self::$auth_callback = $callback;

return true;

}

return false;

}

static function is_logged_in() {

return ! empty ( self::$user_id );

}

static function get_user_id() {

return self::$user_id;

}

static function get_user_pass() {

/*if ( USER_AUTH_SAVE_PWD ) {

return self::$pass;

}

return '';*/

}

static function logout() {

NG_Core::do_action( 'logout', self::$user_id );

self::$user_id = false;

self::$pass = '';

setcookie( USER_AUTH_COOKIE_UID, 'X', time() - 1, '/' );

setcookie( USER_AUTH_COOKIE_HASH, 'X', time() - 1, '/' );

/*if ( USER_AUTH_SAVE_PWD ) {

$_SESSION = array();

if ( session_status() === PHP_SESSION_ACTIVE ) {

session_destroy();

}

}*/

NG_Core::do_action( 'logged_out' );

}

}

2 года назад
guest_15287238561124
6 лет в сервисе
Был
2 года назад
1 отзыв