如何在电报机器人中获得身份验证?
Posted
技术标签:
【中文标题】如何在电报机器人中获得身份验证?【英文标题】:How do I get authentication in a telegram bot? 【发布时间】:2015-09-11 13:55:25 【问题描述】:Telegram Bot 现已准备就绪。
如果我们使用网络浏览器和网站的类比,电报客户端应用程序就像浏览器客户端。
Telegram 聊天室就像网站。
假设我们有一些信息,我们只想限制某些用户,在网站上,我们将进行身份验证。
我们如何在 Telegram Bots 上实现相同的效果?
有人告诉我我可以使用深度链接。见说明here
我将在下面复制它:
使用合适的用户名创建机器人,例如@ExampleComBot 为传入消息设置 webhook 生成足够长的随机字符串,例如$memcache_key = "vCH1vGWJxfSeofSAs0K5PA" 将值 123 和键 $memcache_key 放入 Memcache 3600 秒(一小时) 向我们的用户显示按钮https://telegram.me/ExampleComBot?start=vCH1vGWJxfSeofSAs0K5PA 配置 webhook 处理器以使用以 /start 开头的传入消息中传递的参数查询 Memcached。 如果密钥存在,则将传递给 webhook 的 chat_id 记录为 用户 123 的 telegram_chat_id。从 Memcache 中删除密钥。 现在,当我们要向用户 123 发送通知时,请检查他们是否有字段 telegram_chat_id。如果是,请使用 sendMessage Bot API 中的方法在 Telegram 中向他们发送消息。
我知道如何进行第 1 步。
我想了解其余的。
这是我在尝试破译第 2 步时想到的图像。
因此,各种电报客户端在与其应用程序上的 ExampleBot 通信时与电报服务器通信。通信是双向的。
第 2 步建议 Telegram 服务器通过 webhook 更新 ExampleBot 服务器。 Webhook 只是一个 URL。
到目前为止,我说的对吗?
下一步将如何使用它进行身份验证?
【问题讨论】:
【参考方案1】:更新:我用一个非常简单的 php 应用程序创建了一个 GitHub 存储库来说明下面解释的概念:
https://github.com/pevdh/telegram-auth-example
您是否使用网络钩子无关紧要。 “深层链接”解释:
-
让用户通过实际的用户名-密码认证登录一个实际的网站。
生成唯一的哈希码(我们将其称为 unique_code)
将 unique_code->用户名保存到数据库或键值存储中。
向用户显示 URL https://telegram.me/YOURBOTNAME?start=unique_code
现在,只要用户在 Telegram 中打开此 URL 并按“开始”,您的机器人就会收到一条包含“/start unique_code”的文本消息,其中 unique_code 当然会被实际的哈希码替换。
让机器人通过在数据库或键值存储中查询 unique_code 来检索用户名。
将 chat_id->用户名保存到数据库或键值存储中。
现在,当您的机器人收到另一条消息时,它可以查询数据库中的 message.chat.id 以检查该消息是否来自该特定用户。 (并相应处理)
一些代码(使用pyTelegramBotAPI):
import telebot
import time
bot = telebot.TeleBot('TOKEN')
def extract_unique_code(text):
# Extracts the unique_code from the sent /start command.
return text.split()[1] if len(text.split()) > 1 else None
def in_storage(unique_code):
# Should check if a unique code exists in storage
return True
def get_username_from_storage(unique_code):
# Does a query to the storage, retrieving the associated username
# Should be replaced by a real database-lookup.
return "ABC" if in_storage(unique_code) else None
def save_chat_id(chat_id, username):
# Save the chat_id->username to storage
# Should be replaced by a real database query.
pass
@bot.message_handler(commands=['start'])
def send_welcome(message):
unique_code = extract_unique_code(message.text)
if unique_code: # if the '/start' command contains a unique_code
username = get_username_from_storage(unique_code)
if username: # if the username exists in our database
save_chat_id(message.chat.id, username)
reply = "Hello 0, how are you?".format(username)
else:
reply = "I have no clue who you are..."
else:
reply = "Please visit me via a provided URL from the website."
bot.reply_to(message, reply)
bot.polling()
while True:
time.sleep(0)
注意:在 Telegram 客户端中,unique_code 不会显示为“/start unique_code”,只会显示为“/start”,但您的机器人仍会收到“/start unique_code”。
【讨论】:
OP 不希望用户通过他们的 telgram 应用程序进行通信。所以这个答案是无关紧要的,因为它依赖于/start
【参考方案2】:
从 2018 年 2 月起,您可以使用 Telegram Login Widget 通过 Telegram 授权您网站上的人。
【讨论】:
【参考方案3】:我刚刚使用Django 的深层链接实现了an authentication solution。
此解决方案生成身份验证令牌以关联 Telegram 聊天和 Django 用户。当一些电报用户想要访问受限区域时,它会收到一条电报消息,其中包含登录网络的链接。一个登录的网站提供了一个链接,用于使用深度链接开始新的经过身份验证的聊天。
还有a demo 的投票示例,只有登录用户才能通过电报投票。
【讨论】:
有趣。但是我不知道如何使用它来验证用户。如果您能提供一个完整的身份验证示例,我们将不胜感激。【参考方案4】:到目前为止你是对的。
但是,您的要求有点模糊。让我们以另一种方式来看待它。 如果您想向特殊用户发送受限信息,您应该要求用户开始与您的机器人直接聊天,或者简单地使用用户群聊中的 chat_id 开始向他们发送消息。
请注意,只有当用户以“隐私模式”(这是机器人的默认模式)与机器人通信时,您才能访问用户 chat_id。
【讨论】:
我在考虑某种用户名和密码身份验证。或使用 6 位电话密码。以上是关于如何在电报机器人中获得身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
Azure C# 框架 - 如何禁用验证代码以进行身份验证
如何在本地 IdentityContext 中注册从外部身份验证提供程序获得的用户