电报机器人 - OAuth授权

时间:2016-05-16 23:35:24

标签: oauth telegram-bot

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

2 个答案:

答案 0 :(得分:8)

我有同样的想法授权通过Telegram访问第三方服务,我有两个主要想法。 灵感来自解释deep linking usage

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

“授权重定向URI用于来自Web服务器的请求。   这是用户重定向到的应用程序中的路径   在他们通过Google验证后。路径将被追加   使用授权代码进行访问。必须有一个协议。不能   包含URL片段或相对路径。不能是公共IP   地址。 “

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

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

@BotSupport证实了我的假设:

  

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

     

Bot Support,[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
  8. 哈希重定向到您的机器人的URL
  9. 生成包含7
  10. 重定向网址的HTML
  11. 使用参数
  12. 将8实际重定向到您的机器人
  13. 为需要内联参数的/ start命令编写解析器
  14. 使用/ start命令等待webhook
  15. 使用6
  16. 中的键值对识别用户
  17. 删除键值对
  18. 你太棒了!现在您可以访问一些用户数据
  19. 对不起,没有图片或链接,因为我没有声誉

答案 1 :(得分:2)

我使用Telegram deep linkingAWS API Gateway服务解决了此问题。

身份验证方案如下:

  1. 机器人告诉用户打开服务链接并登录
  2. 该服务会重定向到您设置的网址:即向该网址发送请求,其中包含OAuth代码作为code参数
  3. 您需要在机器人中接收该代码,但您不能仅重定向到机器人的URL,因为它接受的唯一参数是start。这在@ evasyuk的答案中有详细描述。

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

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

      

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

    1. 前往控制台create a new 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"
      
    2. 操作> 部署API ,制作一些舞台名称,无所谓

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

      https://<some_id>.execute-api.<region>.amazonaws.com/<stage>
      

      例如

      https://abcdefghij.execute-api.eu-central-1.amazonaws.com/auth
      
    4. 你准备好了。现在,您可以对机器人进行编程,为用户提供服务授权的链接,比如说

      https://some.service.com/auth?response_type=code&client_id=<your_client_id>&redirect_uri=https://abcdefghij.execute-api.eu-central-1.amazonaws.com
      

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

      https://abcdefghij.execute-api.eu-central-1.amazonaws.com/auth?code=<auth_code>
      

      将被重定向到

      https://telegram.me/my_bot?start=<auth_code>
      

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