Laravel 5.5 телеграмма аутентификация
Мне нужно сделать авторизацию через телеграмму. Процедура выглядит следующим образом:
- Генерация случайной строки
- Запишите это в кеш
- Мы передаем эту строку боту через команду /start random_str
- Бот отправляет запрос на сервер, где система сравнивает значение переданной строки и полученное от бота
- Если все хорошо, мы авторизуем / регистрируем пользователя
Все рушится во время авторизации. Ведь авторизация сохраняется в сеансе, а сеанс бота всегда отличается и не совпадает с сеансом пользователя, отправившего запрос с сайта. Но я уже видел такие разрешения, например, 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.