2

Codeigniter の Form Validation を Web サービスで使用するにはどうすればよいのでしょうか? REST と cURL を使用して Web サービスに接続していて、ログイン ページでフォーム検証を使用しようとしていました。ユーザー名またはパスワードのフィールドが空白の場合にエラーを返すようにすることはできますが、それを使用してパスワードが一致することを確認する方法がわかりません。私の cUrl コードは次のとおりです。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-DocuSign-Authentication: $header"));
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
$output = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$this->form_validation->set_rules('username', 'USERNAME', 'required|is_unique[username]');
$this->form_validation->set_rules('password', 'PASSWORD', 'required|matches[password]');
if ($this->form_validation->run() == FALSE) {
    curl_close($ch);
    $this->load->view('error_login');
} else {        
    $response = json_decode($output, true);
    $accountId = $response["loginAccounts"][0]["accountId"];
    $baseUrl = $response["loginAccounts"][0]["baseUrl"];
    $userName = $response["loginAccounts"][0]["userName"];
    curl_close($ch);
    $username = $userName;
    $docusignURL = $baseUrl;
    $docHeader = $header;
    $loggedIn = array('is_logged_in' => true);
    $this->session->set_userdata('username', $username);
    $this->session->set_userdata('docusignURL', $docusignURL);
    $this->session->set_userdata('docHeader', $docHeader);
    $this->session->set_userdata($loggedIn);
    redirect('/create_envelope', 'refresh');
}

現在、「未定義のオフセット: 1」と「未定義のプロパティ: Login::$db」という 2 つのエラー通知が返されています。後者は、モデルを使用してデータベースに接続していないと想定しているためです。どんな有益なアドバイスも素晴らしいでしょう。

編集:コールバック ルートを試してみましたが、500 エラーが発生しています。これまでのコントローラーコード全体は次のとおりです。

<?php
    class Login extends CI_Controller {

        function index() {
            $this->load->view('al_login');
        }

        function authenticate(){

            $post = $this->input->post();
            extract($post);

            $integratorKey = '****-********-****-****-****-************';       
            $header = "<DocuSignCredentials><Username>" . $username . "</Username><Password>" . $password . "</Password><IntegratorKey>" . $integratorKey . "</IntegratorKey></DocuSignCredentials>";
            $url = "https://demo.docusign.net/restapi/v2/login_information";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-DocuSign-Authentication: $header"));
            curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
            $output = curl_exec($ch);
            $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $response = json_decode($output, true);
            $accountId = $response["loginAccounts"][0]["accountId"];
            $baseUrl = $response["loginAccounts"][0]["baseUrl"];
            $userName = $response["loginAccounts"][0]["userName"];
            curl_close($ch);
            $username = $userName;
            $docusignURL = $baseUrl;
            $docHeader = $header;
            $loggedIn = array('is_logged_in' => true);
            $this->session->set_userdata('username', $username);
            $this->session->set_userdata('docusignURL', $docusignURL);
            $this->session->set_userdata('docHeader', $docHeader);
            $this->session->set_userdata($loggedIn);
            $this->form_validation->set_rules('username', 'USERNAME', 'required');
            $this->form_validation->set_rules('password', 'PASSWORD', 'required|callback_password_check');

            if ($this->form_validation->run() == FALSE) {
                $this->load->view('al_login');
            } else {
                $this->load->view('/create_envelope');
            }
        }

        function password_check($str){

            // send the user name to the service 
            if ( $this->authenticate($str) == true ) {
                return true; 
            } else { 
                // customize the message with something 
                $this->form_validation->set_message('password_check', 'The %s is incorrect. Please try again');
                return false;
            } 
        }       
    }

私は REST、cURL、および Codeigniter を初めて使用するので、私の知識が役に立ちます。お二方、今までありがとうございました。500 エラーが発生する理由を教えてください。

NEW EDIT: @Petreだから、これは私たちのWebサービスからの応答です:

Array ( 
    [loginAccounts] => Array ( 
        [0] => Array ( 
            [name] => ******** 
            [accountId] => ******* 
            [baseUrl] => https://demo.docusign.net/restapi/v2/accounts/******* 
            [isDefault] => true 
            [userName] => **** ******** 
            [userId] => ********-****-****-****-************ 
            [email] => ****@******.com
            [siteDescription] => 
        ) 
    ) 
)

そのようなものではないようです。

4

2 に答える 2

0

あなたが望むものは「コールバック」と名付けられていると思いますhttp://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#callbacks

最初に、カール レスト コードが正しく機能していることを確認します。true または false または単純なものをエコーアウトして、その結果を確認するだけです。次に、コールバックに統合します。

彼らが名前を付けたマニュアルの例から行く: callback_username_check

 function username_check($str){

 // send the user name to the service 
 if ( $this->_sendUserName($str) == true ) 
 { return true ; } 

 else{ 
  // customize the message with something 
  $this->form_validation->set_message('username_check', 'The %s is incorrect so have another cup of coffee and try again');
  return false ; } 

 }

rest/curl コードだけを持つ別のメソッドを呼び出していることに注意してください。そうすれば、サービスが変更された場合でも、コールバックを変更する必要はありません。

編集 - 「ユーザー名」の例を使用して、ガイドの例と一致させました。

ユーザー名とパスワードの両方をサービスに送信する必要がある場合は、ユーザー名の基本的な検証を行ってから、パスワードのコールバックを行うことをお勧めします。したがって、パスワードの値はコールバックから取得され、ユーザー名の値を取得します

   $username = $this->input->post('username', TRUE);

$this->input->post() は検証の前後のどこでも使用できます。TRUE xss はそれをきれいにします。

通常、誰かがユーザー名とパスワードを台無しにした場合、そのパスワードは正しくありません。そのため、コールバックを使用して検証を行うことで、失敗した場合 (フォームを再度表示したときに)、ユーザー名は引き続き入力されます。また、サービスが失敗した理由に関する情報をサービスから取得している場合は、その情報とともに表示されるエラー メッセージをカスタマイズできます。

于 2013-10-11T22:13:04.580 に答える