2009-07-06 38 views
7

Tôi đang tạo một dịch vụ web bằng cách sử dụng các phương thức SOAP gốc của PHP5. Mọi thứ đều ổn cho đến khi tôi cố gắng xử lý xác thực bằng cách sử dụng các tiêu đề SOAP.Thu thập/xử lý tiêu đề trong PHP Soap Server

tôi có thể dễ dàng tìm thấy cách thêm tên người dùng/mật khẩu để tiêu đề SOAP, client-side:

$myclient = new SoapClient($wsdl, $options); 

$login = new SOAPHeader($wsdl, 'email', 'mylogin'); 
$password = new SOAPHeader($wsdl, 'password', 'mypassword'); 
$headers = array($login, $password); 

$myclient->__setSOAPHeaders($headers); 

Nhưng tôi không thể tìm thấy bất cứ nơi nào các phương pháp thu thập và xử lý các tiêu đề máy chủ -side. Tôi đoán có phải là một cách dễ dàng để xác định một phương pháp trong SoapServer của tôi xử lý các tiêu đề ...

Trả lời

5

SoapClient sử dụng tên người dùng và mật khẩu để thực hiện xác thực HTTP. Xác thực cơ bản và thông báo được hỗ trợ (see source)

Để biết thông tin về việc triển khai xác thực HTTP trong PHP ở phía máy chủ, hãy xem this manual page.

Nếu bạn không muốn sử dụng xác thực HTTP, hãy xem this user-contributed sample trên trang hướng dẫn SoapServer hiển thị cách bạn có thể chuyển một số thông tin đăng nhập vào tiêu đề UsernameToken.

+0

tôi đang cố gắng để bắt đầu sử dụng chỉ Thư viện SOAP, vì vậy mà không có xác thực HTTP.Và tôi đã thử mẫu do người dùng đóng góp mà bạn đã đề cập, nhưng nó dường như chỉ hoạt động khi tôi không * sử dụng Định nghĩa WSDL. WSDL, tôi sẽ tiếp tục tìm kiếm. Cảm ơn bạn đã nhập tho. – altermativ

+0

Có, bạn cần phải xác định các tiêu đề vào tệp WSDL. – Ant

1

Bạn có thể thử đọc dữ liệu RAW POST.

if ($_SERVER['REQUEST_METHOD'] == 'POST') 
{ 
    $xml = file_get_contents('php://input'); 
    print(htmlspecialchars($xml); 
    // XML processing 
} 

Trong $ xml, bạn sẽ có toàn bộ yêu cầu SOAP XML.

SoapServer không có phương pháp để đọc tiêu đề SOAP.

- chỉnh sửa: góp dụ từ thủ công dường như không làm việc, tiêu đề phương pháp xử lý không bao giờ được gọi

1

Bạn phải sử dụng một phiên bản hiện tại của PHP. Với PHP 5.2.4 tôi đã có cùng một vấn đề, nhưng với 5.2.17 hoặc 5.3.8 gọi lại cho xử lý tiêu đề SOAP (được mô tả trong samle do người dùng đóng góp trên php.net) được gọi và mọi thứ hoạt động khá tốt.

5

Với phiên bản PHP hiện đại, KHÔNG cần thêm bất kỳ thứ gì vào WSDL làm tiêu đề là một phần của đặc tả SOAP Envelope.

Người dùng đã đóng góp dụ trích dẫn bởi Paul Dixon không hoạt động đơn giản chỉ vì tiêu đề không phải là UserToken như được viết trong các bình luận, tiêu đề là an, vì vậy đó là là tên phương pháp lớp nên có. Sau đó, bạn nhận được một đối tượng stdClass đẹp với một thuộc tính đối tượng UserDoken stdClass có Tên người dùng và Mật khẩu làm thuộc tính.

Ví dụ mã (sẽ được chèn vào trong một lớp học PHP mà thực hiện các dịch vụ SOAP:

public function Security($header ){ 
     $this->Authenticated = true; // This should be the result of an authenticating method 
     $this->Username = $header->UsernameToken->Username; 
     $this->Password = $header->UsernameToken->Password; 
    } 

trình như một nét duyên dáng cho Tên đăng nhập/Mật khẩu dựa WSSE Xà phòng An ninh