Авторизация через Steam на PHP

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

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

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

Итак, вам потребуется файл OpenID.php из библиотеки LightOpenID. Если ваш сайт работает на PHP 5-7, скачайте оригинальный файл. Если же ваш сайт работает на PHP 8, то скачайте мою версию файла с правками для PHP 8. Загрузите файл на ваш сервер в директорию, из которой будете его подключать. Рекомендую создать на сайте директорию inc или lib, в которую вы будете складывать все подключаемые вручную библиотеки, чтобы поддерживать порядок в файлах.

Далее, определитесь, откуда на вашем сайте будет производиться авторизация через Steam. Если у вас есть другие способы авторизации, вы можете просто создать там кнопку “Войти через Steam” со ссылкой на php скрипт, который мы сейчас будем создавать.

Итак, предположим, что мы создали скрипт steam_auth.php. Подключаем в него скачанную библиотеку:

require __DIR__ . '/inc/OpenID.php';

Объявим контстанту со ссылкой на скрипт, который сейчас создаем, она чуть позже нам понадобится:

define('STEAM_REDIRECT', 'https://example.com/steam_auth.php');

Далее пишем код самой авторизации:

try {
	$openid = new LightOpenID(STEAM_REDIRECT); // здесь константа со ссылкой на этот скрипт
	if (!$openid->mode) {
		$openid->identity = 'http://steamcommunity.com/openid/?l=russian';
		header('Location: '.$openid->authUrl());
	}
	elseif ($openid->mode == 'cancel') {
		header('Location: /'); // здесь можно редиректить пользователя, если он начал процесс авторизации через steam, но отказался от него
	}
	elseif ($openid->validate()) {
		$id = $openid->identity;
		$sid64 = intval(preg_replace('/[^0-9]/', '', $id));
		
		// авторизация пройдена, у вас появился Steam_ID64 пользователя, теперь вы можете писать здесь любой ваш код 
		
		header('Location: /'); // после вашего кода нужно редиректнуть пользователя на нужную вам страницу сайта
	}
	else header('Location: /');
}
catch(ErrorException $e) {
	header('Location: /');
}

Как видите, ничего сложного. В том месте кода, где указано, что авторизация пройдена, вы можете начать с того, что пропишете echo $sid64; и протестируете авторизацию на вашем сайте. Просто перейдите по ссылке на созданный скрипт, после чего вас перенаправит в Steam, затем, после авторизации, вернет обратно на этот скрипт и вы должны увидеть в браузере ваш SteamID64 (новый SteamID вида 76561198210303223). Если все так – значит авторизация работает.

Получив SteamID64 после авторизации пользователя, вы можете делать что угодно, в зависимости от ваших целей. Приведу несколько примеров того что вы можете сделать:

  • завершить процесс авторизации, создав необходимые куки в браузере пользователя и запись о сессии в БД
  • обновить дату входа пользователя в БД, если вы храните эти даты
  • конвертировать SteamID64 в старый SteamID32 вида STEAM_0:1:12501874 (может понадобиться для игр на движке Source, таких как Couter Strike или Garry’s Mod)
  • обратиться к Steam Web API для получения аватарки пользователя, его никнейма и других сведений.