misstsaal / laravel-vk-mini-apps-auth

为 Laravel 提供的 VK Mini Apps 订阅用户认证包

v1.1.6 2020-09-11 13:21 UTC

This package is auto-updated.

Last update: 2024-09-11 21:56:43 UTC


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,
],

使用方法

用户必须实现 Mistersaal\VkMiniAppsAuth\VkMiniAppsAuthenticatable 接口。getVkIdFieldName 方法应返回 VK 用户 ID 字段的名称。

现在可以使用中间件 '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() 方法可用于获取从 URL 中获得的 vkID。

为了自动注册用户,可以创建以下控制器,它不会被中间件保护

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];
        }
    }
}