Bỏ qua, đến nội dung

Chi tiết luồng xác thực Telegram

Plugin Telegram hỗ trợ hai luồng xác thực: Login Widget (web browser) và Web App (Telegram Mini App). Cả hai đều dùng HMAC-SHA256 nhưng với key khác nhau.

Luồng A: Login Widget

Dùng cho đăng nhập trên web browser thông qua Telegram Login Widget.

Sequence diagram

Chi tiết HMAC verification

Telegram Login Widget gửi auth data cùng hash để chứng minh dữ liệu từ Telegram. Cách verify:

  1. Lấy tất cả params trừ hash
  2. Sắp xếp theo tên alphabetically
  3. Nối thành string: key=value, mỗi cặp cách nhau bởi \n
  4. Tính secret = SHA256(bot_token)
  5. Tính expected = HMAC_SHA256(secret, data_check_string)
  6. So sánh expected với hash (cả hai dạng hex)

Ví dụ:

data_check_string:
auth_date=1234567890
first_name=John
id=123456789
username=johndoe

secret = SHA256("1234567890:ABCdefGHIjkl...")
hash = HMAC_SHA256(secret, data_check_string)

Luồng B: Web App

Dùng cho xác thực trong Telegram Mini App (WebApp).

Sequence diagram

Chi tiết HMAC verification (WebAppData)

Web App dùng key khác với Login Widget:

  1. Lấy tất cả params từ initData trừ hash
  2. Sắp xếp alphabetically, nối bằng \n
  3. Tính secret = HMAC_SHA256("WebAppData", bot_token) — lưu ý key là string "WebAppData"
  4. Tính expected = HMAC_SHA256(secret, data_check_string)
  5. So sánh với hash

Khác biệt quan trọng: Login Widget dùng SHA256(bot_token) làm secret, Web App dùng HMAC_SHA256("WebAppData", bot_token).

So sánh hai luồng

Tiêu chíLogin WidgetWeb App
Khi nào dùngWeb browserTelegram Mini App
HTTP methodGET (redirect)POST (AJAX)
HMAC keySHA256(bot_token)HMAC_SHA256("WebAppData", bot_token)
Data formatQuery paramsinitData (query string in body)
AvatarKhông tảiTải từ Bot API + lưu storage
Endpointtelegram:redirecttelegram:validate
CORSBậtBật

Avatar download (Web App only)

Trong Web App flow, nếu user có photo_url:

  1. Server gọi Telegram Bot API với photo_url để tải ảnh
  2. Lưu ảnh vào storage/uploads/
  3. Cập nhật field avatar cho local user

Lưu ý: avatar chỉ tải trong Web App flow, Login Widget không tải avatar tự động.

Xử lý lỗi

LỗiNguyên nhânGiải pháp
HMAC mismatchBot token sai hoặc data bị tamperingKiểm tra bot token
auth_date too oldData quá cũ (Login Widget)User thử lại đăng nhập
initData invalidMini App gửi sai formatKiểm tra window.Telegram.WebApp.initData
Avatar download failedBot API không truy cập đượcKiểm tra kết nối internet từ server