ほとんどの初心者向けのVKontakte、Mail.ruなどによる承認-2

最後の部分では、VKontakteを介して承認を検討しました。今日は、mail.ruと両方のソーシャルネットワークからのアバターの使用に焦点を当てます。

まず、いつものように、ソーシャルネットワークにアプリケーションを登録する必要があります(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に拡大されたアバターを取ることをお勧めします。



All Articles