mistersaal / laravel-vk-mini-apps-auth
Пакет для аутентификации пользователя VK по подписи VK Mini Apps для Laravel
Requires
- laravel/framework: >=7
README
Установка
composer require mistersaal/laravel-vk-mini-apps-auth
php artisan vendor:publish --provider=Mistersaal\VkMiniAppsAuth\VkMiniAppsAuthServiceProvider
В .env файл добавить:
VK_SECRET="your_secret_key" VK_TOKEN="your_service_token"
В config\auth.php:
- defaults.guard => 'vkMiniApps'
- в массив guards добавить:
'vkMiniApps' => [
'driver' => 'vkSign',
'provider' => 'vkUsers',
],
- в массив providers добавить:
'vkUsers' => [
'driver' => 'vkMiniApps',
'model' => App\User::class,
],
Использование
User должен имплементировать Mistersaal\VkMiniAppsAuth\VkMiniAppsAuthenticatable. Метод getVkIdFieldName должен возвращать название поля с VK id пользователя.
Теперь можно использовать middleware 'auth.vk', который будет пропускать только аутентифицированных пользователей Vk Mini Apps (!!! он не пропустит пользователя, которого еще нет в вашей базе !!!)
URL с подписью передавайте с каждым запросом в заголовке 'X-Vk-Auth-Url' (либо измените в config/vkminiapps.php). Пример для axios:
import axios from 'axios'; window.axios = axios; window.axios.defaults.headers.common['X-Vk-Auth-Url'] = window.location.href;
В хэлпере auth() или фасаде Auth будет доступен метод getVkIdentifier(), который выозвращает vkID, полученный из url.
Для автоматической регистрации пользователя можно сделать вот такой контроллер, который не будет защищен мидлваром:
class LoginController extends Controller { /** * @param VkUsersData $vkUsersData Класс для получения пользователя с данными по апи (сами реализуете как вам надо) *@return array */ public function login(VkUsersData $vkUsersData) { //Если подпись верна и пользователь уже есть, то вернет true //Если пользователя нет в базе, то false //Если ошибка подписи, то выбросит VkSignException (можно не отлавливать, пользователь просто получит 500) if (auth()->validate()) { $user = auth()->user(); $vkUsersData->updateUserData($user); $user->save(); return ['success' => true, 'newUser' => false]; } else { $vkId = auth()->getVkIdentifier(); $user = $vkUsersData->getNewUser($vkId); $user->save(); return ['success' => true, 'newUser' => false]; } } }