それはまさにそうだった-人間は怠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"); } ?>
デモ