Mail.Ru AgentでのXMPPプロトコルおよびFacebookのXMPPサーバーでの承認の「秘密」のサポート

Windows向けMail.Ru Agentバージョン5.8のリリースについてお知らせします。



このバージョンの主な「機能」は、以前にSymbianおよびJava 2 Micro Editionプラットフォームのモバイルクライアントに登場したXMPPプロトコル(Jabber)のサポートです。 視聴者の中で最もアクティブで技術的に「高度な」部分がモバイルメッセージングを使用しているため、モバイルプラットフォームのXMPPの実験を開始しました。 しかし、「機能」は、デスクトップを含め、非常に人気があり、需要があることが予想外に判明しました。



このプロトコルをサポートする主なアイデアは、最近XMPPプロトコルを使用して内部メッセージングシステムへのパブリックインターフェイスを開いたソーシャルネットワークVkontakteとFacebookのユーザーとのIMメッセージの交換を可能にすることです。 Mobile Agentでの経験からわかるように、これはXMPPクライアントを使用する最も一般的なケースです。



ただし、ソーシャルネットワークの「投獄」にもかかわらず、当社のプロトコル実装は一般的な拡張機能(XEP-XMPP拡張プロトコル)のほとんどをサポートしているため、Mail.Ruエージェントをクライアントとして使用して、任意のXMPPサーバーに接続できます。 すぐに使用できるVkontakte、Facebook、Google Talk、Yandex.Online、QIPサービスがサポートされていますが、必要に応じて、任意のアカウント(たとえばJabber.Ru)に接続できます-設定でJID(Jabber ID)とパスワードを指定するだけです(サーバーのIPアドレスは、DNSへのSRV要求によって自動的に決定されます)。



XMPPクライアントの実装の機能について話すと、ユーザー認証の分野で主な問題が発生しました。 実際には、VkontakteおよびFacebook XMPPサーバーは、Webサービスでの認証に使用され、さまざまな電子メールアドレスを表すログインではなく、 idXXXX @ vk.comおよびALIAS@chat.facebok.comの形式のJIDによってユーザーを認証します。 、それぞれ。 XMPPプロトコルでは、ユーザーJIDのドメインは、このJIDが属するXMPPサーバーのドメインと一致する必要があるため、これは論理的です。



VKontakteの場合、idXXXXは、たとえば、プロファイルのURLで表示できる内部ユーザー識別子です。 C Facebookはもう少し複雑でした。 デフォルトでは、ユーザーにはエイリアスがまったくありません- アカウント設定で設定できますが、場合によっては、このアクションを確認するためにSMS認証を行う必要があります(Facebookから送信されたコードをSMSメッセージとして入力します)。 また、FacebookはロシアにSMSを配信しません(いずれにしても、数か月前でした)。



何らかの方法で、ユーザーにMail.Ruエージェントの設定で「魔法の」識別子(日常生活で遭遇することはない)を入力させるという考えは失敗したように思えたため、すぐに同じログインとパスワードでXMPPの承認をサポートすることにしました。 Webでの承認に使用されます。



VKontakteを使用すると、すべてがシンプルになりました。同僚に連絡し、「Web」ログイン/パスワードでidXXXXを返すシンプルなAPIを提供しました。 さらに、それは技術的な問題でした。Mail.RuAgent設定でユーザーが指定したidXXXXとパスワードを取得し、標準のDIGEST-MD5メソッドを使用してXMPPサーバーにログインするだけです。



Facebookは私たちをいじくり回しました。 ユーザーのJID承認(PLAINおよびDIGEST-MD5メソッドを使用)に不便なことに加えて、XMPPサーバーはSASL認証もサポートします。 理論的には、この考えは簡単です。 ブラウザはクライアントアプリケーションで起動され、ユーザーは通常のログイン/パスワードを使用してログインします。 承認に成功すると、サーバーはクライアントブラウザーにトークンを返します。クライアントブラウザーでは、XMPP認証が既に実行されています(一部の変換が完了した後)。 残念ながら、このメカニズムの単純さにもかかわらず、Facebookが非常に曖昧に文書化したいくつかの微妙な点があるため、多くの開発フォーラムを調査し、多くの実験をしなければなりませんでした。 :)



この小さな研究の結果を皆さんと共有できることを嬉しく思います(Facebook用のXMPPクライアントを作成することにした場合)。



そのため、まず、 Facebook管理パネルで独自のアプリケーションを作成する必要があります。



明らかなオプションに加えて、アプリケーション設定で、「非推奨の認証方法を無効にする」オプションを無効にする必要があります。



SASLを介してログインするには、認証トークンを取得する必要があります。 ここでの主なトリックは、OAuth認証用のhttp要求を適切に構成することです。 次のようになります。



www.facebook.com/dialog/oauth?client_id=123&response_type=token&redirect_uri=http://agent.mail.ru/&display=popup&scope=xmpp_login,offline_access







ここのclient_idは、アプリケーションのIDです。

response_type-認証が成功した場合にサーバーが返すデータ型(この場合はトークン)。

redirect_uri-認証が成功した後にブラウザがリダイレクトされるURL。このURLのドメインは、アプリケーションの設定で指定されたドメインと必ず一致する必要があります。

スコープ -要求されたアクセス権。 xmpp_loginオプションを使用すると、受信した認証トークンをXMPPサーバーでのSASL認証に使用できます。offline_accessは、このトークンに「永遠の」有効期間を提供します(ユーザーが接続するたびにログイン/パスワードを入力する必要がなくなります)。



認可が成功した場合、httpサーバーはブラウザをredirect_uriにリダイレクトし、access_token変数(実際には認可トークン)をGETパラメーターとして追加します。 この変数の値は、記号「|」で3つの部分に分割された文字列です。



216315195049043|19d8c4fcd929d1324ce9ed5f.1-100001685116a73|ifwc5qPhOguAhc3vaRmtCBnqv7E







セッションキーという中間部分に関心があります。



ここで、XMPPサーバーとの接続を確立し、「独自の」 X-FACEBOOK-PLATFORMメソッドを使用して、XMPPサーバーから認証を要求する必要があります。 このリクエストに応じて、サーバーはチャレンジを返します。これは次のような行です。



version=1&method=auth.xmpp_login&nonce=859F2F4CD0F6B245A22EB6382D9689DB







次に、およそ次の行を作成します。



api_key=321call_id=407808859method=auth.xmpp_loginnonce=859F2F4CD0F6B245A22EB6382D9689DB session_key=19d8c4fcd929d1324ce9ed5f.1-100001685116a73v=1.02b613865ef9e9f742caac8d163da3631







api_keyはアプリケーションのAPIキーです(アプリケーションIDと混同しないでください)。

call_id-乱数;

method-チャレンジからコピーされた値を持つパラメーター。

nonce-チャレンジからコピーされた識別子。

セッションキー -トークンから取得したセッションキー

v-バージョン番号(Facebookは1.0の使用を推奨しています)。



バージョン番号の後の値(2b613865ef9e9f742caac8d163da3631)は、アプリケーションの秘密キーに対応します(APIキーおよびアプリケーションIDと混同しないでください)。



この行のパラメーターは、アンパサンドなどの区切り文字なしで後に続くことに注意してください。 次のステップでこの行からmd5を計算し、次の形式の新しい行を形成するため、行内のパラメーターのシーケンスは重要です。



api_key=321&call_id=407808859&method=auth.xmpp_login&nonce=859F2F4CD0F6B245A22EB6382D9689DB&session_key=19d8c4fcd929d1324ce9ed5f.1-100001685116a73&sig=da0f8f0363a9f7e1cb479fcd88f10716&v=1.0







ここで、すべてのパラメーターは前の行に似ており、sigはそれからmd5()です。 ここでは、パラメーターは既にアンパサンドで共有されています。



結果の文字列はbase64メソッドでエンコードされ、XMPPサーバーに次のデータでログインします。



  <レスポンスのxmlns = "壷:IETF:のparams:XML:NS:XMPP-SASL"> YXBpX2tleT0zMjEmY2FsbF9pZD00MDc4MDg4NTkmbWV0aG9kPWF1dGgueG1wcF9sb2dpbiZub25jZT04NTlGMkY0Q0QwRjZCMjQ1QTIyRUI2MzgyRDk2ODlEQiAmc2Vzc2lvbl9rZXk9MTlkOGM0ZmNkOTI5ZDEzMjRjZTllZDVmLjEtMTAwMDAxNjg1MTE2YTczICZzaWc9IGRhMGY4ZjAzNjNhOWY3ZTFjYjQ3OWZjZDg4ZjEwNzE2JnY9MS4w </レスポンス> 


出来上がり、私たちはXMPPサーバーで承認されており、XMPPサーバーとメッセージを交換できます。



OAuth / SASL認証の欠点は、J2MEやSymbianなどのプラットフォームのモバイルクライアントに実装できないことです。これらのOSのAPIはユーザーアプリケーションにブラウザーへの直接アクセスを提供しないためです(認証トークンを取得します)。



Mail.Ru Agent 5.8を試してみてください。特にXMPPクライアントの動作についての感想をお待ちしています。



イリヤ・ナウモフ、

プロジェクトマネージャーMail.Ruエージェント



All Articles