Laravel 5.5 телеграмма аутентификация

Мне нужно сделать авторизацию через телеграмму. Процедура выглядит следующим образом:

  1. Генерация случайной строки
  2. Запишите это в кеш
  3. Мы передаем эту строку боту через команду /start random_str
  4. Бот отправляет запрос на сервер, где система сравнивает значение переданной строки и полученное от бота
  5. Если все хорошо, мы авторизуем / регистрируем пользователя

Все рушится во время авторизации. Ведь авторизация сохраняется в сеансе, а сеанс бота всегда отличается и не совпадает с сеансом пользователя, отправившего запрос с сайта. Но я уже видел такие разрешения, например, https://storebot.me/

AuthController (веб-сайт)

public function getLogin()
{
    cache(['auth_key' => str_random(24)], 10);
    return view('panel.auth.login');
}

AuthController (Bot)

public function auth(Request $request): JsonResponse
{
    if (!isset($request->auth_key) || $request->auth_key !== cache('auth_key')) {
        return response()->json([
            'status' => false,
            'message' => 'invalid_token',
        ]);
    }

    if (!auth()->check()) {
        if (!$user = User::where('username', $request->user['username'])->first()) {
            DB::beginTransaction();
            try {
                $user = new User();
                $user->chat_id = $request->chat_id;
                $user->username = $request->user['username'];
                $user->first_name = $request->user['first_name'];
                $user->last_name = $request->user['last_name'];
                $user->save();
                DB::commit();
            } catch (\Exception $e) {
                DB::rollBack();
                return response()->json([
                    'status' => false,
                    'message' => $e->getMessage()
                ]);
            }
        }

        auth()->login($user);
    }

    return response()->json([
        'status' => true,
        'message' => 'Вы успешно авторизированы.',
    ]);
}

login.blade.php

<a href="https://t.me/surgead_bot?start={{ cache('auth_key') }}" target="_blank">Открыть <i class="fa fa-telegram"></i> и нажать Start</a>

bot.js (длинный скрипт опроса для бота)

bot.onText(/\/start (.+)/, (msg, params) => {
axios.post('auth', {
    auth_key: params[1],
    chat_id: msg.chat.id,
    user: msg.from
})
    .then(response => {
        console.log(response.data);
        if (response.data.status === false) {
            // log or smth??
        }

        bot.sendMessage(msg.from.id, response.data.message);
    })
    .catch(error => {
        console.log(error);
    });

});

Итак, у меня есть Laravel 5 в качестве бэкэнда. Бот работает на JS. Я думаю, проблема в сессионном занятии. Потому что, когда я отправляю auth_key боту, он отправляет запрос на сервер, а сеанс аутентификации не для сеанса пользователя, а только для бота. Но я понятия не имею, как авторизоваться в нужной сессии. Я пытался создать новый сеанс с идентификатором сеанса пользователя, но Laravel не позволяет этого.

1 ответ

Я сделал это с помощью Autologin на стороне laravel, который регистрируется с помощью токена, хранящегося в MySQL, и в боте telegram генерирует токен и делает ссылку на маршрут laravel.

https://t.me/intermarkbot

Другие вопросы по тегам