И так, для меня в будущем, и для тех кто это нагуглил:
Дело в том что без виджета на начало 2024 сделать авторизацию практический не возможно, вот реально правильное решение если у вас похожий стэк, и вы планируете делегировать саму регистрацию на сервер, а не делать все через front.
Интегрируем виджет в приложение react + ts:
(это если вам надо что бы был не редирект, а вызов функции со стороны telegram)
import { useEffect } from 'react'
import { ITelegramUser } from '../../../../types/telegram/api-telegram-user.ts'
declare global {
interface Window {
onTelegramAuth: (user: ITelegramUser) => void
}
}
export const ButtonTelegramAuth = () => {
useEffect(() => {
const button = document.createElement('script')
button.async = true
button.src = 'https://telegram.org/js/telegram-widget.js?22'
button.setAttribute('data-telegram-login', 'name_bot')
button.setAttribute('data-size', 'large')
button.setAttribute('data-radius', '20')
button.setAttribute('data-onauth', 'onTelegramAuth')
document.body.appendChild(button)
window.onTelegramAuth = function (user) {
alert(
'Logged in as ' +
user.first_name +
' ' +
user.last_name +
' (' +
user.id +
(user.username ? ', @' + user.username : '') +
')'
)
}
return () => {
document.body.removeChild(button)
}
}, [])
return <div id="telegram-widget-container"></div>
}
если нужен все таки редирект мы добавляем такое поле:
script.setAttribute('data-auth-url', 'https://site.pw');
и удаляем это:
button.setAttribute('data-onauth', 'onTelegramAuth')
declare global {
interface Window {
onTelegramAuth: (user: ITelegramUser) => void
}
}
window.onTelegramAuth = function (user) {
alert(
'Logged in as ' +
user.first_name +
' ' +
user.last_name +
' (' +
user.id +
(user.username ? ', @' + user.username : '') +
')'
)
}
И так объясняю в чем задумка:
В ваше приложение react интегрируется все тот же виджет, но правильным образом. После нажатия на виджет происходит авторизация пользователя (он вводит свои данные / просто нажимает войти). Потом телеграм передает все его данные вам (в функцию - №1 способ / по get параметрам в url). Если вы делегируете
регистрацию на сервер (а так правильно) то выбираете 2 способ. Сервер получает данные валидирует их и заносит в БД, затем делает редирект вашего пользователя к вам обратно на front, и заносит token (или что там еще не разобрался) в HttpOnly Ckookie. Ну а далее в моем случае Guard будет проверять есть этот token или нет, годен он или нет.
Передаю привет Максиму в будущем. Как дела Макс ?