Wargaming.net Public APIを使用したサイトの認証モジュール

ベータテストでWG P APIがリリースされて以来、最も一般的な質問は「サイトで認証を行う方法」でした。

それはまさにそうだった-人間は怠aな生き物です。

Wargaming開発者パートナープログラムの他の参加者の生活を簡素化するために、サイトの認証モジュールを作成した経験を共有したいと思います。



2つのオプションがあります。

1. OpenIDを使用する

承認プロセスのロジックを説明しました。ハブ上のOpenIDに関する記事

2. APIメソッドを使用して認証モジュールを作成します。

すべての一般的なCMSのプラグインについては説明しません。一般的なスキームのみを説明し、コードの例を示します。



理論



ユーザーを認証するために、WG APIには現在3つのメソッドがあります。

auth / login-メソッドはユーザーの認証に使用されます-access_tokenを取得します。

auth /延長 -この方法を使用すると、ユーザーの介入なしにaccess_tokenを拡張できます

auth / logout -access_tokenを破壊する方法



access_tokenは、プレイヤーのアカウントに関する個人情報を取得するために使用されます-格納庫にあるテクニックに関する情報、プレイヤーの友人のアカウント識別子など。



前述のようにaccess_tokenを取得するには、auth / loginメソッドが使用されます。これは、redirect_uriパラメーターで指定されたアドレスに承認ステータスに関する情報を送信します



WG開発者の一人は次のように述べています。

auth / loginメソッドの機能を拡張することが決定され、分離が導入されます(情報が正常に入力されました)。

1)ユーザーを1つのURLにリダイレクトします。

2)承認情報が2番目に送信されます(POSTまたはGETメソッドを使用)。




理論に戻りましょう。



作業アルゴリズム



ユーザーをリダイレクトするリンクを生成する


まず、ユーザーをさらにリダイレクトするためのURLを生成するためのリクエストを使用して、auth / loginメソッドを有効にする必要があります。

このヘルメットのリクエストについて

https://api.worldoftanks.ru/wot/auth/login/?application_id=<application_id>&redirect_uri=<redirect_uri>&nofollow=1





<application_id>、開発者のオフィスに登録する必要があるアプリケーションのapplication_idです。

<redirect_uri> -ハンドラースクリプトのURL。

パラメーター値はnofollow = 1であるため、メソッドはリダイレクトではなく応答本文でURLを返します。



auth.phpは一度に2つのタスクを実行します。リンクを生成してリダイレクトするか、リダイレクト後にユーザーが戻ってきたら承認します。



ユーザーをWG Webサイトにリダイレクトする


この例では、リンクを生成した後、スクリプト自体がユーザーをリダイレクトします。

数行のコードを変更することにより、「ログイン」ボタンをクリックした後、「Loading ...」(またはloader.gifを貼り付ける)を記述するためにjavascriptでコードをかき混ぜることができます。

ユーザーが碑文(まあ、または写真)を賞賛している間、jsはスクリプトにリクエストを送信し、apiにリクエストを送信し、apiはスクリプトに応答し、スクリプトはリンクを返し、最後にjsはユーザーをそれにリダイレクトします。

WG DPPルールはapplication_idの公開を禁止しているため、jsからAPIに直接リクエストを送信することはできません。



ユーザーリターン


プレーヤーがWG Webサイトにログインし、当社のサイトで詳細な統計情報を表示できるようになった後、リダイレクトされます

<redirect_uri> ?&status = ok& access_token = <access_token> &nickname = <_nickname> &account_id = <account_id> &expires_at = <expires_at>

間違いがなければ...

したがって、スクリプトはデータを受け取ります。

ステータスaccess_tokenニックネームaccount_id expires_at

しかし、このデータは信頼できませんが!



ユーザーが戻った後に受信したデータの検証


承認を行う場合、受信したデータが真実であり、WG Webサイトから正確に送信され、手動で登録されていないことを確認する必要があります。

メソッドの作業がやり直されるのはまさにこの瞬間のためです-現時点では、これらのパラメーターを持つプレーヤーがウォーゲーミングWebサイトから来たのか、アドレスバーに入力したのかはわかりません。

$ _SERVER ['HTTP_REFERER']は完全な保証を提供しません。

データの信ver性を検証するために、auth / longateメソッドを使用します

これはオプションの1つです。 延長に加えて、受信したトークンを使用してアカウント/情報をリクエストすることもできます。プライベートデータを取得できれば、すべて問題ありません。

これを使用して、有効なaccess_tokenが転送されたかどうか、それが誰(account_id)に属しているかを確認できます。

すべてが正常である場合、データベースに必要なデータを記録し、ユーザーのCookieを設定します。ログイン/パスワードを使用して、標準認証で必要なすべてを行います。



練習する



 <? define('URL','http://example.com/WGDPPAuth.php');//      define('APPLICATION_ID','demo');//application_id  if(empty($_GET['status'])){//     $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://api.worldoftanks.ru/wot/auth/login/"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,"nofollow=1&expires_at=300&redirect_uri=".URL."&application_id=".APPLICATION_ID); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data=json_decode(curl_exec($ch),true); curl_close ($ch); if($data['status']=='ok'){ header ('Location: '.$data['data']['location']); exit(); }else{ exit('     .'); } }elseif(isset($_GET['status']) && isset($_GET['access_token']) && isset($_GET['nickname']) && isset($_GET['account_id']) && isset($_GET['expires_at'])){//      ,    auth/login if($_GET['status']!="ok"){ $error_code=500; if(preg_match('/^[0-9]+$/u', $_GET['code'])){ $error_code=$_GET['code']; } exit(" .  : $error_code"); }elseif($_GET[expires_at]<time()){ exit(" .   access_token ."); }else{ $context = stream_context_create( array('http' => array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => http_build_query( array( 'expires_at' => 14*24*60*60, 'access_token' => $_GET['access_token'], 'application_id' => APPLICATION_ID ) ) ) ) ); $data=json_decode(@file_get_contents('https://api.worldoftanks.ru/wot/auth/prolongate/', false, $context),true);//    if($data['status']=="ok"){ $access_token=$data[data][access_token]; $expires_at=$data[data][expires_at]; $account_id=$data[data][account_id]; //     ,     ,   ,   . exit('   id <b>'.$account_id.'</b><br /> <b>'.$access_token.'</b>,      <b>'.date("dmY H:i:s",$expires_at).'</b>'); }else{ exit('access_token  '); } } }else{ $error_code=500; if(preg_match('/^[0-9]+$/u', $_GET['code'])){ $error_code=$_GET['code']; } exit(" .  : $error_code"); } ?>
      
      





デモ



All Articles