Очень сильно упрощенно, без ООП и паттернов):
Авторизация:
session_start();
if (!empty($_SESSION['user_id']))
die('Вы уже авторизованы');
$user = get_user_by_login($_POST['login']);
if (!$user)
die('Пользователь не найден');
if ($_POST['pass'] !== $user['pass'])
die('Неверный пароль');
$_SESSION['user_id'] = $user['id'];
die('Привет, '.$user['login']);
При этом в куки пользователя запишется session_id, а в сессию user_id.
Проверка:
session_start();
if (empty($_SESSION['user_id']))
die('Нет прав');
$user = get_user_by_id($_SESSION['user_id']);
if (!$user || !$user['active'])
{
unset($_SESSION['user_id']);
die('Нет прав');
}
Выход:
session_start();
unset($_SESSION['user_id']);
Если нужен доступ только с одного устройства (последнего, с которого был вход), то храним на сервере последнюю сессию пользователя и при каждом запросе:
if ($user['session_id'] !== session_id())
{
unset($_SESSION['user_id']);
die('Нет прав');
}
Если с нескольких, то делать ничего не нужно.
При oauth авторизации через внешние сервисы в сессии и куках будет все то же самое.
В бд добавятся 2 поля auth_provider и auth_provider_id.
В auth_provider у тебя будет vk или fb или google... в auth_provider_id - id пользователя в vk, fb...
Когда юзер нажимает кнопку войти через vk, ты его редиректишь на контакт. Там он что-то делает. Потом контакт его редиректит к тебе с ?code=request_code.
Ты используя code делаешь запрос к api контакта на получение access_token.
Получив access_token, делаешь запрос к api на получение инфы о пользователе. В этой инфе должен быть какой-нибудь уникальный id (auth_provider_id).
Если у тебя нет пользователя с таким auth_provider_id для провайдера vk, то создаешь его либо без логина, либо генерируешь что-нибудь, без пароля.
Если пользователь был создан или он был до этого, помещаешь в сессию user.id и считаешь пользователя авторизованным.
PS:
По каждой строчке ответа есть нюансы, но думаю общая картина такая.
Естественно лучше написать класс для пользователя, чтобы использовать что-то вроде:
$user->is_auth();
$user->auth_by_id($user_id);
$user->unauth();