Авторизация телеграмм 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');
}

Аутконтроллер (бот)

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' => 'Вы успешно авторизированы.',
    ]);
}

логин.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 не разрешает этого.


person weijinnx    schedule 03.10.2017    source источник
comment
Можете ли вы опубликовать код и описать, как настроена система?   -  person John Mercier    schedule 03.10.2017
comment
@JohnMercier добавил. Надеюсь на помощь, спасибо!   -  person weijinnx    schedule 04.10.2017


Ответы (1)


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

https://t.me/intermarkbot

person Community    schedule 23.04.2018