Z-Payment(OAuth 2.0)を介したサイトでの承認

画像 こんにちはhabrasociety! この記事では、サードパーティのサイトでユーザーを承認するための、OAuth 2.0に基づくZ-Payment APIプロトコルについて説明します。 個人情報を(少なくともメールで)共有する必要があることは言うまでもなく、登録は常に怠慢であり、これを1回だけ行う必要がある場合、怠inessは2倍になります。 これが、多数のユーザーを含むインターネットサービスがサードパーティのリソースに対する許可を自分自身で提供する理由であり、この場合のZ-Paymentも例外ではありません。



はじめに



最近、 Z-PaymentチームはOAuth 2.0プロトコルに基づくサーバー認証メカニズムを実装しました。これにより、開発者はZ-Paymentサービスを介してサードパーティサイトで認証を作成し、承認を得て認証済みユーザーの個人データを要求できます。 この方法により、サードパーティのサイトで安全なユーザー認証を実装できます。



このインターフェイスへのアクセスを活用するには、3つの前提条件を満たす必要があります。

  1. Z-Paymentに登録する
  2. サイトを登録する
  3. サイトは一般公開のステータス、つまり Z-Catalogで公開


この承認方法を実装する際のZ-Paymentの主なタスクは、開発者にZ-Paymentリソースを使用して独立したプロジェクトを作成するための別のツールを提供することです。 成功例は、 Z-Change Exchange Exchangeプロジェクトです。

承認プロセスは4つのステップで構成されます。

  1. Z-Paymentでの承認のためのユーザーの移行
  2. 個人データにアクセスするためのユーザー許可。 ユーザーは、サードパーティ(あなた)が要求するデータの提供に同意する必要があります。 ユーザーがZ-Paymentで承認されていない場合、個人アカウントへの承認を求められます。 認証に成功すると、ユーザーは個人データへのアクセスを許可するよう求められます
  3. コード値をサイトに渡してアクセスキーを取得する
  4. プロジェクトサーバーaccess_tokenアクセスキーを取得してZ-Payment APIにアクセスする


順番にもっと



指定:サイト。 タスクは、 Z-Paymentを通じてユーザー承認/登録することです。



ステップ1


Z-Paymentへの認証のためにユーザーをリダイレクトする必要があります。これは、アドレスへのGETまたはPOSTリクエストによって行うことができます。 z-payment.ru/enter.php



z-payment.ru/enter.php



付きの z-payment.ru/enter.php





client_id-システムにサイトを登録するときに発行される必須パラメーター、Z-Paymentの4桁の一意のストア識別子。

redirect-必須パラメーター、認証後にユーザーがリダイレクトされるアドレス(指定されたアドレスのドメインはストア設定のメインドメインに対応する必要があります)

display-必須パラメーター。認証ページの表示タイプを示します。 現在、ページのみがサポートされています。つまり、別のウィンドウでの承認を意味します

scope-オプションのパラメーター。このパラメーターは、ユーザーに関する要求された個人データのリストを担当します。 要求されたデータは、コンマまたはスペースで区切る必要があります。

要求される可能性のあるデータのリストを次に示します。

0 f_name
1 s_name
2 m_name ミドルネーム
3 birth_day 生年月日
4 グループ 証明書の種類
5 性別 性別
6 電子メール 郵便
7 電話 携帯電話番号
8
9 市区町村
10 バランス ウォレットの残高


response_typeはオプションのパラメーターであり、受信する応答のタイプを担当し、値を取ることができます:code-サードパーティのサーバー(デフォルト)から要求を行う場合、またはtoken-クライアントから要求を行う場合

上記のように、GETリクエストは次のようになります。



GET: z-payment.ru/enter.php?client_id=ID__&redirect=http://.ru/login&dispaly=page&scope=f_name,s_name,m_name,phone,city,e_mail&response_type=code









ステップ2


このようなリンクをクリックすると、ユーザーは、スコープパラメーターで要求したデータを第三者(サイト)に提供することに同意するか、そうでない場合は最初にログインしてから同意するように求められるページに移動します。 さらに、自動モードでは、ユーザーの同意を得て、リダイレクトパラメーターで指定されたページに移動します。



ステップ3


戻ると、GETメソッドは一時的なコードを含むコードパラメーターを渡します。 これにより、ユーザーが同意したデータを要求することが可能になります。 パラメータの有効期間は15分です。この期間中、リクエスト元サイトからaccess_token APIへのアクセスキーを取得する必要があります。 次のようになります。



GET: REDIRECT_URI?code=a2a56603b8f57a6fa4dff77380df05206c883f011c40b72630bb5ed6f6479e52a8e

:

GET: REDIRECT_URI?error=invalid_request&error_description=Invalid+display+parameter









ステップ4


最後のステップでは、アドレスz-payment.ru/api/get_access_token.phpにリクエストを送信することでアクセスを取得します。リクエストは、ステップ1のように、GETメソッドまたはPOSTメソッドで送信でき、次のパラメーターを含む必要があります。

client_id -Z-Paymentマーチャントにストアを登録するときに発行される必須パラメーター、zペイメントシステムの4桁の一意のストア識別子(上記を参照)



code-必須パラメーター、ステップ3での許可後に取得される一時コード(上記を参照)



format_answer-オプションの応答形式。デフォルトでjsonが使用されます。 値を取ることができます:json、get。

client_secret-必須パラメーター。電子署名です。 これは、要求パラメーターとマーチャントキーストアのパスワードの接着文字列からハッシュmd5として形成されます。

署名に関係するデータ:client_id + code + MerchantKey-これからMD5を取得します



リクエストの結果は、パラメーターで構成される回答になります。

access_token、expires_inキーの有効期間(秒単位)、user_idウォレットZP番号user_verification-ユーザー認証に関する情報(ユーザーが証明書を持っている場合はyesを受け入れます)、および最初の要求からの要求フィールドのセット。



これで、承認プロセスの理論的な説明が完了しました。

前述に基づいて、プロトコルのソフトウェア実装を作成することができます。PHP5.3で行います。実装されたクラスは、何らかの種類のMVCアーキテクチャで使用されると想定されています。

したがって、タスクは、Z-Paymentを介して認証を自動化するための単純なクラスを作成することです。 コードをすぐに予約したい:

  1. 定義定数は構成ファイルに移動する必要があります。わかりやすくするために例で使用します。

  2. IUserStorageインターフェイスを実装するクラスの例は示しません。データは、セッション(SessionUserStorage)、データベース(DbUserStorage)、またはファイル(FileUserStorage)のどこにでも保存できます。したがって、インターフェイスのみを知っていれば十分です。 コードは文書化されているので、追加のコメントは退屈だと思います。



PHPコード自体
 /** @desc ID      */ define("SHOP_ID", "0001"); /** @desc MERCHANT KEY      */ define("MERCHANT_KEY", "password"); namespace Example; /** @desc           */ interface IUserStorage { /** @desc     */ public function load(); /** @desc       */ public function save(array $data); /** @desc     */ public function erase(); } /** @desc     */ class UserManager { const TOKEN_URL = "https://z-payment.ru/api/get_access_token.php"; /** * @var \Example\IUserStorage * @desc  */ protected $storage; /** * @var $userInfo array * @desc     */ protected $userInfo; /** * @var \Example\Controller\Base * @desc     mvc ,      */ protected $controller; /** * @param IUserStorage $storage * @desc   $storage    \Example\IUserStorage */ public function __construct(\Example\IUserStorage $storage) { $this->storage = $storage; $this->userInfo = $this->storage->load(); } /** @desc   ,     */ public function getUserInfo($field = null) { if (null === $field) return $this->userInfo; if (isset($this->userInfo[$field])) return $this->userInfo[$field]; return null; } /** * @return bool * @desc     */ public function isLogin() { return ($this->userInfo != null); } /** * @desc  ZP  * @return string | null */ public function getAccount() { if (!$this->isLogin()) return null; return $this->userInfo['user_id']; } /** * @return bool * @desc       */ public function isCertified() { return ($this->getUserInfo('user_verification') == 'yes'); } /** * @return bool * @desc    */ public function Login() { /** @desc    code,  mvc   ,      $code = $_REQUEST['code']; */ $code = $this->controller->getRequest()->get("code"); /** * @desc  ,    md5     * 1+2+Merchant Key,  Merchant Key    */ $client_secret = md5(SHOP_ID . $code . MERCHANT_KEY); /** @desc     */ $params = array( /** id  */ 'client_id=' . urlencode(SHOP_ID), /**      */ 'code=' . urlencode($code), /**    */ 'format_answer=' . 'json', /**   */ 'client_secret=' . urlencode($client_secret) ); $curl = curl_init(self::TOKEN_URL); curl_setopt($curl, CURLOPT_HEADER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, implode("&", $params)); /** @desc    */ $result = curl_exec($curl); curl_close($curl); /** @desc    */ $result = json_decode($result); /** @desc     */ if ($result->error != null) return false; /** @desc    */ $this->storage->save((array)$result); return true; } /** * @desc   * @return void */ public function LogOut() { /** @desc   */ $this->storage->erase(); } /** * @param \Example\Controller\Base $controller * @return void * @desc   . */ public function setController(\Example\Controller\Base $controller) { $this->controller = $controller; /** * @var isLogin bool * @desc     */ $controller->getView()->isLogin = $this->isLogin(); /** @var $client_id int */ $client_id = SHOP_ID; /** * @var $redirect_uri string * @desc URL  */ $redirect_uri = "http://example_site_domain.org/login"; $display = "page"; /** * @var $scope strung * @desc   */ $scope = "f_name,s_name,m_name,sex,birth_day,group,e_mail,phone,country,city,balance"; if ($this->isLogin()) { /** @desc   ,      */ $controller->getView()->userName = $this->userInfo['f_name'] . " " . $this->userInfo['s_name']; } else { /** @desc    ,       */ $controller->getView()->linkZpAuth = sprintf("https://z-payment.ru/enter.php?client_id=%s&redirect_uri=%s&display=%s&scope=%s", $client_id, $redirect_uri, $display, $scope); } } }
      
      







ご覧のとおり、認証プロセスは、特にVK APIを見る場合、この機能を提供する他のインターネットサービスとほとんど同じです。 :)



私のささやかな作品を読むことにあなたの忍耐に感謝し、最初の段落を読んだ後にあなたを苦しめ始めた質問に答えたいと思います-「VK、Gmail、Facebookなどよりもユーザーが著しく少ない場合、ZPを介して承認を固定する必要があるのはなぜですか?」 、私は答えます:他のサイトでの多数のOAuthプロトコルの実装とは異なり、Z-Payment APIを介した承認は、検証済みのユーザー情報の取得を意味します。



ドキュメントInterfaceHTTPS.zip docファイルでZ-Payment APIの詳細を読むことができます。



All Articles