The only documented way to use Telegram 3-rd party authorization is to use their script that is being provided at https://core.telegram.org/widgets/login
This script (as I digged) works in pretty strange way
- It renders “Log in with Telegram” button inside the
iframe
with another extrascript
that loads some Telegram entities to work with (likeTWidgetLogin
,TSticker
(?),TVideo
(??),TAudio
(???) and some others). - By clicking on button, this
iframe
opens new window that is performing authorization. - After authorization is being completed, this window is being closed, and since it’s done, the
iframe
checks the authorization again. If it’s done in right way, theiframe
retrieves all shared user info and dependent on type of authorization end callsdata-onauth
or sends request todata-auth-url
.
This behaviour is really unusable for me, because we are also using Google , Github and Facebook OAuths nearby, and all of them are providing the normal usable API to open authorization windows manually and do redirects to specified url.
I mean, that’s how our, for example, Google authorization works:
- User clicks on button that is created on our own, customized to match our application style.
- On click, our application creates new window with url
https://hostname/some/path/to/auth?and_some_params=here
- Our server catches this and redirects to Google OAuth consent screen.
- After Google authorization is being completed, it redirects user to another
/some/path/to/completed_authorization
- Server retrieves all necessary information, and redirects window to
/some/path/to/success_authorization
that has script withwindow.postMessage
to parent window with authorization info. - Parent window (application window) catches this message, closes window and fills storage with given user data.
And thats done. Since opened window is being opened by application, it can be controlled and closed when it’s not in use (e.g. when another auth window is being opened, or when the application tab is being closed).
What is unsuitable in telegram “Log in with telegram” button is:
- No possibility to stylize button to match application style
- No possibility to change content of the button (in our case it is necessary, because our application is multilanguage).
- No possibility to control opened window (it is being opened even if the main window is closed)
For now I can open a window with Telegram OAuth screen using
// 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
But since authorization is being completed, I cannot set anything to let server know that it should retrieve user data and redirect to my page with window.postMessage
Is there any way to achieve Telegram authorization without their “Login with Telegram” button? Any help is highly appreciated.
2
Answers
@Limbo as I can see – the generated widget and code just create an iframe with the content based on our bot name and other params. It each time the same.
For example for (https://oauth.telegram.org/embed/samplebot?origin=https%3A%2F%2Fcore.telegram.org&size=medium&userpic=false), the interested part in response is here:
And it will be the same each time. So, you just add this code to your page whre you can customize the button styles, and put in any place of the page as you want. Just take care of id param and not forget to add an event listener for onClick which will call the TWidgetLogin.auth() when you want to show the login popup.
The TWidgetLogin.init function accepts couple of the params (target_login_btn_id, bot_id, params, init_auth, lang). All of them is self-described.
The interesting part – is about the getting auth info. If you check that widget-frame.js you will find that after successful auth it calls
window.parent.postMessage(JSON.stringify(data), origin || '*');
with user data in data param. In our case (we operate without iframe) the postMessage will be delivered to the current window and you will be able to catch it with simple codeAnd its where you can get all user data that you need.
The only thing – the origin of that message. But this param scripts gets with user data from telegram servers, so I suspect that it will contain the linked site origin and we will not have any problems with that.
Good luck with further investigation.
So there is an even easier way to do it, without directly listening postMessages.
Telegram widget script https://telegram.org/js/telegram-widget.js adds
Telegram
object to window, this object hasLogin
property, which hasauth
function.auth
function acceptsoptions
andcallback
, like so:Pay attention that
callback
will be called withfalse
boolean if authorization is not successful.So all you need to do is load widget script (without data attributes, because otherwise it will initialise iframe with button), then call this function whenever you need:
auth
will open another window with Telegram authorization interface and will listen to this window post messages by itself. When window closes yourcallback
will be called.