Mail.ru(oAuth 2.0)を介したサイトでの承認

みなさんこんにちは!

Habraには、すでにMail.ruを含むさまざまなサービスの承認に関するNodgeの 記事がありました。 しかし、それはYiiのためであり、プロセス自体は詳細に説明されていません。 propovednikからの記事もありましたが、javascript + phpによる認証プロセスについて説明しました。 この記事では、サーバーの認証方法について詳しく調べたいと思います。 承認には、PHPとサーバー間モデルが使用されます。



ステップ1.サイトを登録する



リンクhttp://api.mail.ru/sites/my/addに従ってサイトを登録します。 次に、サイトの確認に必要なreceiver.htmlファイルをダウンロードしてftpにアップロードします。

登録後、3つのパラメーターが与えられます。



ID秘密鍵にのみ関心があります (クライアントサーバーモデルには秘密鍵が必要です)。 これらをスクリプトの構成ファイルに次の名前で保存します。



$APP_ID; $APP_SECRET;
      
      





ステップ2.コードの取得



コードを取得するには、 connect.mail.ru/oauth/authorizeに連絡して、$ _GETパラメーターを渡す必要があります。



便宜上、コードとその処理を受信するリンクを生成するためのロジックを分割します。

example.com/login.php-コードを取得するためのリンク(実際には、承認のためのリンク)を生成します。

example.com/auth.php-処理コード。



最終的なクエリは次のようになります。

 $redirect_uri = urlencode("http://example.com/auth.php"); $login_url = "https://connect.mail.ru/oauth/authorize?client_id={$APP_ID}&response_type=code&redirect_uri={$redirect_uri}";
      
      





このアドレスにアクセスすると、Mail.ruの無許可のユーザーは次のように表示されます。

画像

ユーザーがMail.ruで承認されている場合、ログインとパスワードを入力せずに同じウィンドウが表示されます。

ユーザーには、有効化と無効化の2つのオプションがあります。 禁止することにより、ユーザーはエラーでredirect_uriで指定されたページにリダイレクトされます。



すべてが正常に行われ、ユーザーがサイトに自分のデータへのアクセスを許可した場合、ユーザーは$ _GETコードパラメーターを使用して、 redirect_uriページ(http://example.com/auth.php)にリダイレクトされます。

名前で保存します

 $APP_CODE;
      
      





ステップ3.トークンとuidを取得する



次に、APIにアクセスするために、受信したコードをセッションID(トークン)とMail.ruユーザーIDに交換する必要があります。



これを行うには、 connect.mail.ru/oauth/tokenに連絡して、パラメーターを渡す必要があります。



すべてのパラメーターが必要です。 redirect_uriは、ステップ2で使用したものと完全に一致する必要があります。



トークンのリクエストはPOSTリクエストを介してのみ実行できるため、cURLは以下を支援します。

 $ch = curl_init(); $url = "https://connect.mail.ru/oauth/token"; $fields = Array( 'client_id' => $APP_ID, 'client_secret' => $APP_SECRET, 'grant_type' => "authorization_code", 'code' => $APP_CODE, 'redirect_uri' => urlencode(redirect_uri) ); foreach($fields as $key => $value){ $fields_string .= $key . '=' . $value . '&'; } rtrim($fields_string, '&'); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); $result = curl_exec($ch); curl_close($ch); $arr = json_decode($result, true); // $arr = (array) json_decode($result).  - ,   ? $token = $arr['access_token']; $uid = $arr['x_mailru_vid'];
      
      





ステップ4.ユーザーデータを取得する



トークンuidを受け取った後サイトはwww.appsmail.ru/platform/apiで Mail.ru APIへの待望のアクセスを受け取ります。

しかし、すべてがそれほど単純ではないため、APIへのすべてのリクエストに署名する必要があります。 署名(この場合)は、 separatorとPrivate keyなしでAPIに渡されたアルファベット順にソートされたパラメーター文字列からmd5アルゴリズムを使用して計算されたハッシュです。

例:

 md5('app_id=423004method=friends.getsession_key=be6ef89965d58e56decdfacb9b62bdaa' . $APP_SECRET);
      
      





Mail.ruは、クライアントサーバーとサーバーサーバーの2つの署名オプションを提供します。 違いは、2番目のアプローチのセキュリティが高いことです。 それを使用します。 これを行うには、APIへのリクエストでsecure = 1を指定する必要があります。



users.getInfoメソッドを使用して、Mail.ruユーザーの個人情報を受信するリクエストを処理します。

 $request_params = Array( 'app_id' => $APP_ID, 'uids' => $uid, 'method' => 'users.getInfo', 'secure' => 1, 'session_key' => $token ); //        ksort($request_params); $params = ''; foreach ($request_params as $key => $value) { $params .= "$key=$value"; } //  -    $sig = md5($params . $APP_SECRET); //  $url = "http://www.appsmail.ru/platform/api?method=users.getInfo&app_id={$APP_ID}&session_key={$token}&sig={$sig}&uids={$uid}&secure=1"; $response = file_get_contents($url); $info = (array) json_decode($response); $info = $info[0]; //  print_r($info);
      
      





以上です。 したがって、ユーザーをデータベースに入力するために必要なデータを取得しました。 後続のプロセス全体は、たとえばここで繰り返し説明されています 。 ですから、それを説明する理由はありません。



利益!! 1すべての人に良い。 記事が興味深いものであることが判明した場合、VkontakteとFacebookのサーバー側のoAuth 2.0承認プロセスを分析することもできます。



参照資料




All Articles