2013-10-02 1 views
0

Итак, я пытаюсь использовать REST и cURL с PHP (Codeigniter) для входа в нашу учетную запись DocuSign dev из нашего пользовательского интерфейса. Это код, который я до сих пор:HTTP-аутентификация с использованием формы входа

<?php 

    $integratorKey = '****-********-****-****-****-************'; 
    $username = ''; 
    $password = ''; 
    $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, array("Content-Type: application/xml")); 
    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); 

    if ($status != 200) { 
     echo "error calling webservice, status is:" . $status; 
     exit(-1); 
    } 

    $response = json_decode($output, true); 
    $accountId = $response["loginAccounts"][0]["accountId"]; 
    $baseUrl = $response["loginAccounts"][0]["baseUrl"]; 
    curl_close($ch); 
?> 

<div id="container"> 
    <h1>Welcome</h1> 
    <div id="login_form"> 
     <h1>Login</h1> 
     <?php 
      echo form_open('login/hello'); 
      echo form_input($username, 'Username'); 
      echo form_password($password, 'Password'); 
      echo form_submit('submit', 'Submit'); 
     ?> 
    </div> 
</div> 

Ошибка я получаю 400. Я понимаю, что это, вероятно, потому, что он посылает заголовок, прежде чем пользователь может ввести имя пользователя и пароль. Наверное, я не уверен, как заставить его «ждать» до нажатия кнопки «Отправить» перед отправкой запроса заголовка. Это один из моих первых набегов на REST и cURL. Любая помощь будет принята с благодарностью.

+0

Этот код на этой странице? Или вы отправляете регистрационную форму где-нибудь, чем обрабатываете соединение cURL? – stormdrain

+0

Все на той же странице. – duckie715

+0

Вам нужно обернуть код, чтобы дождаться отправки формы или отправить форму входа в отдельный обработчик. –

ответ

2

Похоже, вы работаете на той же странице. Таким образом, переменные $header не будут заполнены, и запрос не удастся.

Как правило, в codeignter, вы могли бы сделать что-то вроде:

Контроллер:

class Docusign extends CI_Controller{ 

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

} 

View (docusign_auth_view.php)

<div id="container"> 
    <h1>Welcome</h1> 
    <div id="login_form"> 
     <h1>Login</h1> 
     <?php 
      // have to add the target url here in form_open 
      // you also won't have values to populate the fields with 
      // so no need for the $Username/$Password variables 
      // which wouldn't work like that anyway since the field name 
      // goes first, not the value 
      echo form_open('docusign/authenticate'); 
      echo form_input('username'); 
      echo form_password('password'); 
      echo form_submit('submit', 'Submit'); 
     ?> 
    </div> 
</div> 

затем обратно в контроллер DocuSign, добавить функцию для обработки формы:

class Docusign extends CI_Controller{ 

    function index(){ 
     $this->load->view('docusign_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, array("Content-Type: application/xml")); 
     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); 

     if ($status != 200) { 
      echo "error calling webservice, status is:" . $status; 
      exit(-1); 
     } 

     $response = json_decode($output, true); 
     $accountId = $response["loginAccounts"][0]["accountId"]; 
     $baseUrl = $response["loginAccounts"][0]["baseUrl"]; 
     curl_close($ch); 
} 

, так что вы отправляете значения, заполненные формой, в метод контроллера, который затем может помещать их в запрос cURL.

Чтобы войти, нужно посетить http://example.com/index.php/docusign, который будет загружать docusign_auth_view.php, в котором есть форма, которая будет представлена ​​http://example.com/index.php/docusign/authenticate, в которых переменные из формы будут заполняться в запрос CURL, чтобы отправить DocuSign.

+0

Ты потрясающий !!! Он работает сейчас. Спасибо за помощь. – duckie715

+0

Есть ли способ переносить эту регистрационную информацию на нашем сайте, чтобы мы могли получить доступ к ней на разных страницах или вам нужно позвонить в этот логин на каждом контроллере? – duckie715

+0

Зависит от того, как работает docusign. Если они возвращают токен или идентификатор сеанса, вы можете бросить это в сеансе пользователей. Проверьте их документы. – stormdrain

 Смежные вопросы

  • Нет связанных вопросов^_^