まず、いつものように、ソーシャルネットワークにアプリケーションを登録する必要があります(Maylはアプリケーションとサイトを明確に分離していますが、習慣から「アプリケーション」と言います)。 ちなみに、登録プロセス中に3〜5個のjsエラーが表示されますが、そのうちmail.ruで修正されます。 登録後、アプリケーションID、秘密キー(非公開、js-api呼び出しに使用、全員に表示)、および秘密キー(サーバー間対話に使用、誰にも伝えず、コメントで忘れないでください)にアクセスできます。
アプリケーション設定ページには、もう1つの興味深いパラメーター「receiver.htmlページのアドレス」があります。 なぜそれが必要なのかを知ることを意図していない場合、証明書から学ぶことは次のとおりです。
APIサイトが正しく機能するためには、ドメインにreceiver.htmlファイルを配置する必要があります。
JS APIを使用する予定がない場合、このファイルは必要ありません。 認証/登録ページにボタンを配置します。 MailのPR部門では、ロゴの変更を非常に厳しく禁止しているため、提供されたとおりの形で使用しています。

写真のリンクは次のいずれかです。
connect.mail.ru/oauth/authorize?client_id=APP_ID&response_type=token&redirect_uri=_REDIRECT_URI&host=http://HOST.com
ここで、hostパラメーターでアプリケーションの番号、ドメインを指定し、redirect_uriパラメーターでリダイレクトのURIを指定する必要があります。
2番目のオプションは、JS APIを使用して中間ページを作成することです。以下は、1つのスペースにインデントを削除するメールのネイティブな例です。
<script type= "text/javascript" src= "http://cdn.connect.mail.ru/js/loader.js" ></script>
<script type= "text/javascript" >
mailru.loader.require( 'api' , function () {
mailru.connect.init( '_APP_ID_' , '__PRIVATE_KEY__' );
mailru.events.listen(mailru.connect.events.login, function (session){
window.location.reload();
});
mailru.events.listen(mailru.connect.events.logout, function (){
window.location.reload();
});
mailru.connect.getLoginStatus( function (result) {
if (result.is_app_user != 1) {
mailru.connect.initButton();
} else {
mailru.common.users.getInfo( function (result){console.log(result[0].uid)});
location.href= '/mail.login.php' ;
}
});
});
</script>
<a class = "mrc__connectButton" >@mail.ru</a>
* This source code was highlighted with Source Code Highlighter .
なぜ2番目のオプションが必要なのでしょうか? 人生が示しているように、ユーザーが最初のオプションからリンクをクリックし、ユーザー名とパスワード(現時点では5月に認証されていない場合)でページにアクセスすると、アドレスバーはhttpsでドメインはmail.ruですが、ユーザーはパニックに陥り、ユーザー名とパスワードを盗もうとしていると思います。 理由は定かではありませんが、これらの同じフィールドをポップアップウィンドウに表示すると(見た目がよくなり、使用頻度も高くなります)、パニック状態のユーザーが少なくなります。
そのため、どのオプションを選択したかにかかわらず、ユーザーの結果として、それはmail.login.phpページまたはユーザーが指定した別のページに転送されます。 ドメインのmail.ru側でユーザーの認証が成功した場合、ユーザーはmrcという名前のCookieを作成します。これは次のように解析できます。
parse_str(urldecode($_COOKIE['mrc']),$array);
そして、ここではあまり快適な瞬間が明確にされていません:署名に署名/検証するために、APIはmd5比較(&記号なしでアルファベット順にソートされたすべての要求パラメーターのリスト)とmail.ru Cookieからのsigパラメーターを使用します。 したがって、メールチームによって提案された2つの小さな機能が必要です。
function sign_client_server(array $request_params, $uid, $private_key) {
ksort($request_params);
$ params = '' ;
foreach ($request_params as $key => $value) {
$ params .= "$key=$value" ;
}
return md5($uid . $ params . $private_key);
}
function sign_server_server(array $request_params, $secret_key) {
ksort($request_params);
$ params = '' ;
foreach ($request_params as $key => $value) {
if ($key!= 'sig' ) {
$ params .= "$key=$value" ;
}
}
return md5($ params . $secret_key);
}
* This source code was highlighted with Source Code Highlighter .
sign_server_server関数を少し調整し、配列要素のキーが「sig」と等しくないことを確認するチェックを追加しました。 これは、各チェックの前に、配列から要素を削除したり、検証のために配列を別の配列にコピーしたりしないようにするためです。
まず、答えが本当にソーシャルネットワークから来たかどうかを確認しましょう($配列にはメールCookieからの情報があります)。
if (sign_server_server($array,$secretkey)==$array[ 'sig' ]) {
驚くべきことに、配列からsig要素を削除せずに「ネイティブ」関数を使用して署名を検証した場合、比較はfalseを返します。 メールからの初期情報はかなり少ないため(メール上のユーザーセッションの識別子と有効期限のみで、実際には必要ありません)、users.getInfoメソッドを使用して名前、姓
//
$ params = array(
"method" => "users.getInfo" ,
"app_id" => "640345" ,
"session_key" =>$array[ 'session_key' ],
"uids" =>$array[ 'vid' ],
"secure" => "1"
);
$url = "http://www.appsmail.ru/platform/api?" .http_build_query($ params ). "&sig=" .sign_server_server($ params ,$secretkey);
$response = json_decode(file_get_contents($url));
* This source code was highlighted with Source Code Highlighter .
多くの人は、リクエストを生成するために自転車を発明する必要はありません;組み込みのhttp_build_query関数があります。 $ responseは、ユーザーオブジェクトの配列(この場合、配列に1つの要素があります)を返し、そこから名、姓、ニックネーム、識別子、およびアバターを取得します。 いずれにせよ、このデータが必要であるため、データベースを照会する前にこれを行います(名前、姓、およびアバターを更新します)。
ソーシャルネットワークからデータを受信したら、次は私たちの側で作業をします。 批判を受け入れ、使用するデータベースのタイプから少し抽象化する:
$stmt = $dbh->prepare( "SELECT id FROM tracker_users WHERE username = :username" );
$stmt->bindParam( ":username" , "mm-{$array[' vid ']}" , PDO::PARAM_STR, 23);
$stmt->execute();
MyMirソーシャルネットワークのユーザーの場合、「mm-20桁」などのログインを強調表示することにしました。 はい、識別子としての20桁の数字です。駐車場の通常の整数にキャストしないでください。 その後、ユーザーが既にデータベースにいる場合、データを更新し、Cookieを作成してメインページに転送します。ユーザーがそこにいない場合は、テーブルにエントリを作成し、前の段落のアクションを実行します。
if ($stmt ->fetchColumn() > 0) {
//
} else {
//
}
前の記事で明らかになったように、すべてのリクエストと詳細の完全なプレゼンテーションに誰も関心がないので、統合の次の段階であるソーシャルネットワークのアバターで停止します。 小さな画像(近くのコメントを表示するのに理想的)は$ response [0]-> pic_smallにあり、前の記事のVKontakteアバターは$ _GET ['photo_rec']のGETパラメーターから取得できます。 Mayilのアバターのサイズは45 x 45で、VKontakteからは50 x 50であることに注意してください。両方のオプションが正方形で、同じサイズに縮小できることをお勧めします。 50から50にしたい場合は、メールから90から90に拡大されたアバターを取ることをお勧めします。