我想在我的机器人上通过Twitch API实现OAuth授权,当我在寻找更好的解决方案时,我找到了这个@GitHubBot。在这个bot重定向URL开始为integrations.telegram.org/github,我想知道如何实现这样的auth。如果您愿意,您能告诉最佳实践在电报机器人中实施OAuth吗?更好的情况:授权码还是隐含授权?
提前谢谢!
答案 0 :(得分:8)
我有同样的想法授权通过Telegram访问第三方服务,我有两个主要想法。 灵感来自解释deep linking usage:
“授权重定向URI用于来自Web服务器的请求。 这是用户重定向到的应用程序中的路径 在他们通过Google验证后。路径将被追加 使用授权代码进行访问。必须有一个协议。不能 包含URL片段或相对路径。不能是公共IP 地址。 “
因此,这种方法动态唯一重定向URI是乞讨失败。
@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 :(得分:2)
我使用Telegram deep linking和AWS API Gateway服务解决了此问题。
身份验证方案如下:
code
参数您需要在机器人中接收该代码,但您不能仅重定向到机器人的URL,因为它接受的唯一参数是start
。这在@ evasyuk的答案中有详细描述。
我的解决方案是设置一个AWS API Gateway端点,该端点将使用来自服务的auth代码接收回调,并使用start
参数将其重定向到bot的链接。以下是执行此操作的基本步骤。
我假设您拥有一个AWS账户,但如果没有,它很容易创建,您可以完全免费使用此解决方案一年:
API Gateway免费套餐每月包含一百万次API调用,最长可达12个月。
前往控制台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"
按操作> 部署API ,制作一些舞台名称,无所谓
您将获得新创建的端点的链接,例如
https://<some_id>.execute-api.<region>.amazonaws.com/<stage>
例如
https://abcdefghij.execute-api.eu-central-1.amazonaws.com/auth
你准备好了。现在,您可以对机器人进行编程,为用户提供服务授权的链接,比如说
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>
(但代码不会出现在聊天记录中)。您的机器人可以保存此代码并将其用于用户身份验证(获取令牌)。