电报机器人 - OAuth授权

Max*_*Max 12 oauth telegram-bot

我想在我的机器人上通过Twitch API实现OAuth授权,当我在寻找更好的解决方案时,我找到了这个@GitHubBot.在这个bot重定向URL开始为integrations.telegram.org/github,我想知道如何实现这样的auth.如果您愿意,您能告诉最佳实践在电报机器人中实施OAuth吗?更好的情况是什么:授权码或隐含授权?
先感谢您!

lau*_*lic 13

我使用Telegram 深度链接AWS API Gateway服务解决了这个问题。

认证场景是这样的:

  1. 机器人告诉用户打开服务链接并登录
  2. 该服务重定向到您设置的 URL:即向该 URL 发送请求,其中包含 OAuth 代码作为code参数

您需要在您的机器人中接收该代码,但您不能仅仅重定向到您机器人的 URL,因为它接受的唯一参数是start. 这在@evasyuk 的回答中有很好的描述。

我的解决方案是设置一个 AWS API Gateway 端点,该端点将接收带有来自服务的授权代码的回调,并将其重定向到带有start参数的机器人链接。以下是执行此操作的基本步骤。

我假设您有一个 AWS 账户,但如果没有,创建起来很容易,您可以完全免费使用此解决方案一年:

API Gateway 免费套餐包括每月 100 万次 API 调用,最长可达 12 个月。

  1. 前往控制台创建一个新的 API Gateway。您可以创建一个新的并按照步骤操作,或者您可以导入 Swagger 定义(不要忘记更改机器人 URL!)

    ---
    swagger: "2.0"
    info:
      version: "2017-02-25T14:22:32Z"
      title: "BotAuthRedirect"
    schemes:
    - "https"
    paths:
      /:
        x-amazon-apigateway-any-method:
          produces:
          - "text/html"
          parameters:
          - name: "code"
            in: "query"
            required: false
            type: "string"
          responses:
            200:
              description: "200 response"
              schema:
                $ref: "#/definitions/Empty"
          x-amazon-apigateway-integration:
            type: "http"
            httpMethod: "GET"
            passthroughBehavior: "when_no_match"
            responses:
              default:
                statusCode: "200"
            requestParameters:
              # This is where we map `code` query parameter to `start`
              integration.request.querystring.start: "method.request.querystring.code"
            # Don't forget to change your bot's username:
            uri: "https://telegram.me/my_bot"
    definitions:
      Empty:
        type: "object"
        title: "Empty Schema"
    
    Run Code Online (Sandbox Code Playgroud)
  2. Actions > Deploy API,取一些 stage name,没关系

  3. 您将获得新创建的端点的链接,例如

    https://<some_id>.execute-api.<region>.amazonaws.com/<stage>
    
    Run Code Online (Sandbox Code Playgroud)

    例如

    https://abcdefghij.execute-api.eu-central-1.amazonaws.com/auth
    
    Run Code Online (Sandbox Code Playgroud)

你准备好了。现在你可以对你的机器人进行编程,为用户提供服务授权的链接,比如

https://some.service.com/auth?response_type=code&client_id=<your_client_id>&redirect_uri=https://abcdefghij.execute-api.eu-central-1.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

一旦用户关注并登录,他将被发送到

https://abcdefghij.execute-api.eu-central-1.amazonaws.com/auth?code=<auth_code>
Run Code Online (Sandbox Code Playgroud)

这将被重定向到

https://telegram.me/my_bot?start=<auth_code>
Run Code Online (Sandbox Code Playgroud)

并且通常用户会回到他的 Telegram 应用程序,在那里他可以按“开始”按钮。一旦他这样做了,机器人就会收到一条消息/start <auth_code>(但代码不会出现在聊天记录中)。您的机器人可以保存此代码并将其用于用户身份验证(获取令牌)。


eva*_*yuk 9

我有同样的想法授权通过Telegram访问第三方服务,我有两个主要想法.灵感来自解释深层链接用法:

  • 第一个想法是创建具有唯一重定向URI的唯一授权URL.不幸的是,在Google控制台中设置凭据时,我错过了有关重定向URI的说明.它说

"授权重定向URI用于来自Web服务器的请求.这是您的应用程序中用户在通过Google身份验证后重定向到的路径.该路径将附加授权代码以进行访问.必须具有协议.不能包含URL片段或相对路径.不能是公共IP地址."

因此,这种方法动态唯一重定向URI是一个失败的乞讨.

  • 第二个是获取对资源的访问权限,之后将散列授权结果直接发送到机器人.预计看起来像这样:ttps://telegram.me/bot?hashed_code = code但不幸的是,我发现这也不像计划那样有效.我真的很失望这个事实,但经过一些偷偷摸摸我发现通过直接URL将参数传递给你的机器人的唯一方法是/ start命令!

@BotSupport确认了我的假设:

JV,[17.09.16 22:16]我需要在第三方服务上授权用户.例如,Google日历.所以,我决定创建一个简单的URI,重定向到服务登录并使用token\authCode将URL重定向到我的服务器.至于oauth没有对用户进行身份验证,我仍然需要以某种方式确定谁准确授予了对其资源的访问权限.所以我的下一个逻辑步骤是散列收到的令牌并通过ttps将其发送给用户://telegram.me/BOT?code = xxx我确信如果有/ code的commandHandler和/ code在bot命令列表中我可以打开与我的机器人的对话,并通过webhook将这个散列的代码发送回我的服务器,以便检测访问授权步骤中究竟是谁.当我发现我的计划在最后一步被破坏时,我感到震惊:据我所知,只有/ start命令可以被触发.我的问题是:你能确认只有/ start命令可以通过URL查询参数吗?如果是这样,你能给我一些关于授权和认证用户的正确方法的建议吗?

机器人支持,[20.09.16 01:50]嗨,对不起等待.您正在谈论深度链接(https://core.telegram.org/bots#deep-linking),实际上,只有/ start和/ startgroup可以在那里使用.

最后,我能够执行成功的用户授权\识别,但在对话中间看到START按钮看起来很奇怪.

简历:您不能像在ttps://telegram.me/youtube或ttps://telegram.me/GitHubBot中那样执行静默授权,但您可以执行"足够接近"的静默oauth授权版本

注意:目前我很难说出机器人是如何实现的(youtube,GitHubBot),但它应该是这个机器人的一些独特的后门,只要他们重定向到ttps://integrations.telegram.org/youtube/oauth_redirect具有相同的方案(至少,来自oauth服务的重定向URI不包含识别用户的唯一信息,就像我在本文中描述的那样)也许,有一种方法可以使用某些参数使auth URL唯一,但据我所知,这是不允许的.

计划实施的步骤:

  1. 设置webhook
  2. 添加oauth_cb端点
  3. 获取应用的凭据,例如Google控制台
  4. 等待回调到oauth_cb end_point
  5. 为步骤4中的授权代码创建哈希
  6. 将hash和auth_code保存为键值对
  7. 使用5的哈希创建重定向到机器人的URL
  8. 生成包含7的重定向URL的HTML
  9. 使用参数将8实际重定向到您的bot
  10. 为您的/ start命令编写解析器,该命令需要内联参数
  11. 使用/ start命令等待webhook
  12. 使用6中的键值对来标识用户
  13. 删除键值对
  14. 你太棒了!现在您可以访问一些用户数据

对不起,没有图片或链接,因为我没有声誉

  • 好的,我发现个性化链接的方法是可能的:OAuth RFC 允许您添加自定义唯一参数“状态”,该参数将从授权请求传递到结束。顺便说一句,它是一个强烈推荐的参数,因为它应该是唯一的签名哈希,旨在防止身份验证代码伪造。因此,我使用相同的缓存机制,除了通过用户请求亲自为一个用户生成的身份验证 URL 之外。我成功地实现了静默 OAuth,就像使用 YouTube 或 GitHub 机器人所做的那样。希望我的研究帮助了某人 (2认同)