首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >电报bot - OAuth授权

电报bot - OAuth授权
EN

Stack Overflow用户
提问于 2016-05-16 23:35:24
回答 2查看 16.2K关注 0票数 19

我想通过Twitch在我的机器人上实现OAuth授权,当我在寻找更好的解决方案时,我发现了这个@GitHubBot。在这个bot中,要重定向URL,从Integrations.Telegram. for /github开始,我想知道如何像这样实现auth。如果您愿意的话,您能告诉您在电报机中实现OAuth的最佳实践吗?什么是更好的情况:授权代码还是隐式授权?

提前谢谢你!

EN

回答 2

Stack Overflow用户

发布于 2016-09-18 22:01:16

我有同样的想法,授权通过电报访问第三方服务,我有两个主要想法。受解释的深层链接用法启发

  • 第一个想法是使用惟一的重定向URI创建唯一的授权URL。不幸的是,当在Google控制台中设置凭据时,我忽略了关于重定向URI的解释。上面写着

“授权的重定向URL用于web服务器的请求。这是用户在通过Google验证后重定向到的应用程序中的路径。该路径将附加授权代码进行访问。必须有协议。不能包含URL片段或相关路径。不能是公共IP地址。”

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

  • 第二种方法是访问资源,然后将散列授权结果直接发送给bot。它应该是这样的:ttps://telegram.me. It /bot?散列代码=代码,但不幸的是,我发现它也不像计划的那样工作。我对这个事实真的很失望,但是经过一些偷偷摸摸之后,我发现通过直接URL将参数传递给你的机器人的唯一方法是/start命令!

@BotSupport证实了我的假设:

合资公司,17.09.16 22:16我需要授权第三方服务的用户。例如,谷歌日历。因此,我决定创建一个简单的URI,它可以重定向到Service登录,并使用token\authCode将URL重定向到我的服务器。至于oauth没有对用户进行身份验证,我仍然需要确定到底是谁授予了对他的资源的访问权限。因此,我的下一个逻辑步骤是散列接收到的令牌,并通过ttps://telegram.me. my / bot ? code =xxx将其发送回用户。我确信,如果commandHandler for /code并且/code在bot命令列表中,我将能够打开与bot的对话,并通过web钩子将这些散列代码发送回我的服务器,以检测到底是谁在访问授权步骤。当我发现我的计划在最后一步被毁时,我感到震惊:据我所见,只有/start命令可以被触发。我的问题是:您能确认只有/start命令才能通过URL查询参数吗?如果是的话,你能给我一些关于授权和认证用户的正确方法的建议吗? Bot支持,20.09.16 01:50嗨,对不起。您正在谈论的是深度链接(https://core.telegram.org/bots#deep-linking),实际上,只有/start和/startgroup可以在那里使用。

最后,我成功地执行了用户授权\标识,但是在会话中间看到START按钮看起来非常奇怪。

简历:您不允许执行无声授权,就像在ttps://telegram.me. of /youtube或ttps://telegram.me.of/GitHubBot中所做的那样,但是您可以执行“足够接近”的沉默oauth授权版本

注意:就目前而言,我很难确切地知道机器人是如何实现的(youtube,GitHubBot),但是对于这个机器人来说,它应该是一个独特的后门,因为它们使用相同的方案重定向到ttps://integrations.telegram.org/youtube/oauth_redirect (至少,oauth服务的重定向URI不包含识别用户的唯一信息,就像我在这篇文章中描述的那样),也许有一种使用某些参数使auth唯一的方法,但据我所知,这是不允许的。

计划实现的步骤:

  1. 安装网钩
  2. 添加oauth_cb端点
  3. 获取应用程序的凭据,例如Google控制台
  4. 等待回调到oauth_cb end_point
  5. 为步骤4中的授权代码创建一个散列。
  6. 将散列和auth_code保存为键值对。
  7. 从5创建重定向到bot的URL,并使用散列
  8. 从7生成包含重定向URL的HTML
  9. 实际重定向8到你的机器人参数
  10. 为需要内联参数的/start命令编写解析器
  11. 使用/start命令等待web钩子
  12. 使用6中的键值对标识用户
  13. 移除键值对
  14. 你真给力!现在允许您访问一些用户数据。

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

票数 18
EN

Stack Overflow用户

发布于 2017-02-25 15:20:22

我用电报深联AWS API网关服务解决了这个问题。

身份验证场景如下:

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

您需要在bot中接收该代码,但不能仅仅重定向到bot的URL,因为它只接受start。这一点在@evasyuk的回答中得到了很好的描述。

我的解决方案是设置一个API端点,该端点将从服务接收带有auth代码的回调,并将其重定向到带有start参数的bot链接。以下是实现这一目标的基本步骤。

我假设您有一个AWS帐户,但如果没有,则很容易创建,您可以在一年内免费使用该解决方案:

API网关免费层包含每月100万次API调用,最多12个月。

  1. 转到控制台到创建一个新的API网关。您可以创建一个新的并执行以下步骤,或者您可以导入Swagger定义的(不要忘记更改bot URL!): -昂首阔步:"2.0“信息:版本:"2017-02-25T14:22:32Z”标题:"BotAuthRedirect“方案:- "https”路径: /: any:产生:- "text/html“参数:- name:"code”in:"query“required: false type:"string”回复: 200:描述:"200响应“模式:$ref:”#/definitions/空“x-amazon-apigateway-整合:类型:"http”httpMethod:"GET“passthroughBehavior:"when_no_match”响应:默认: statusCode:"200“requestParameters:#这是我们将code查询参数映射到start integration.request.querystring.start:"method.request.querystring.code“#不要忘记更改bot的用户名: uri:"bot”定义:空:类型:“对象”标题:“空模式”
  2. 按动作>部署API,做一些艺名,这不重要
  3. 您将为新创建的端点获得一个链接,如下所示 https://.execute-api..amazonaws.com/ 例如 https://abcdefghij.execute-api.eu-central-1.amazonaws.com/auth

你已经准备好出发了。现在你可以编程你的机器人给用户一个链接到服务授权,比如说

代码语言:javascript
复制
https://some.service.com/auth?response_type=code&client_id=<your_client_id>&redirect_uri=https://abcdefghij.execute-api.eu-central-1.amazonaws.com

一旦用户跟踪并登录,他将被发送到

代码语言:javascript
复制
https://abcdefghij.execute-api.eu-central-1.amazonaws.com/auth?code=<auth_code>

它将被重定向到

代码语言:javascript
复制
https://telegram.me/my_bot?start=<auth_code>

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

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37264827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档