使用 Telegram 3-rd 方授权的唯一记录方式是使用https://core.telegram.org/widgets/login提供的脚本
这个脚本(正如我挖掘的那样)以非常奇怪的方式工作
- 它在内部呈现“使用 Telegram 登录”按钮,并
iframe
带有另一个script
加载一些 Telegram 实体的额外功能(如TWidgetLogin
,TSticker
(?) ,TVideo
(??) ,TAudio
(???)和其他一些)。 - 通过单击按钮,这
iframe
将打开正在执行授权的新窗口。 - 授权完成后,此窗口关闭,完成后,
iframe
再次检查授权。如果以正确的方式完成,则iframe
检索所有共享用户信息并取决于授权结束调用的类型data-onauth
或将请求发送到data-auth-url
.
这种行为对我来说真的无法使用,因为我们也在附近使用 Google、Github 和 Facebook OAuths,并且所有这些都提供了正常可用的 API 来手动打开授权窗口并重定向到指定的 url。
我的意思是,这就是我们的,例如,谷歌授权的工作方式:
- 用户点击我们自己创建的按钮,自定义以匹配我们的应用程序风格。
- 单击时,我们的应用程序会使用 url 创建新窗口
https://hostname/some/path/to/auth?and_some_params=here
- 我们的服务器捕获此信息并重定向到 Google OAuth 同意屏幕。
- 谷歌授权完成后,将用户重定向到另一个
/some/path/to/completed_authorization
- 服务器检索所有必要的信息,并将窗口重定向到具有授权信息的父窗口的
/some/path/to/success_authorization
脚本window.postMessage
。 - 父窗口(应用程序窗口)捕获此消息,关闭窗口并使用给定的用户数据填充存储空间。
大功告成。由于打开的窗口是由应用程序打开的,因此它可以在不使用时被控制和关闭(例如,当另一个身份验证窗口正在打开时,或者当应用程序选项卡正在关闭时)。
电报中不合适的“使用电报登录”按钮是:
- 无法将按钮风格化以匹配应用程序风格
- 无法更改按钮的内容(在我们的例子中是必要的,因为我们的应用程序是多语言的)。
- 无法控制打开的窗口(即使主窗口关闭,它也会被打开)
现在我可以使用 Telegram OAuth 屏幕打开一个窗口
// some code above
this.popup = window.open("https://oauth.telegram.org/auth?bot_id=<my_bot_id>&origin=http%3A%2F%2F<mydevorigin>&request_access=write, "authWindow", <some window params>)
// some code below
但是由于授权正在完成,我无法设置任何内容让服务器知道它应该检索用户数据并重定向到我的页面 window.postMessage
有没有办法在没有“使用电报登录”按钮的情况下获得电报授权?任何帮助都受到高度赞赏。