2011-11-18 21 views
6

Tôi muốn triển khai hệ thống đăng nhập OpenID với bản phát hành LightOpenID mới nhất. Tôi đang thử nghiệm ví dụ được cung cấp cùng với dòng mã nguồn theo dòng (tôi vừa thay thế localhost bằng $_SERVER['HTTP_HOST'] trong hàm tạo).Mã đăng nhập OpenID không thành công trong máy chủ trực tiếp

Vấn đề là mọi thứ hoạt động tốt trong hộp phát triển của tôi bên trong mạng riêng (PHP/5.3.6 trên Windows Vista) nhưng xác thực luôn thất bại trong máy chủ cuộc sống của tôi tại mạng công cộng HSP (PHP/5.3.3 trên CentOS).

Tôi đã thêm tất cả var_dump() xung quanh và tôi có thể cho bạn biết rằng cả hai bản sao của mã sản xuất chính xác cùng một tham số yêu cầu và nhận chính xác cùng một thông số phản hồi (qua GET). Chỉ openid.assoc_handle, openid.sig, openid.response_nonceopenid.return_to có các giá trị khác nhau, mà tôi đoán là hành vi mong đợi.

Tuy nhiên, hộp dev của tôi nhận được điều này từ các nhà cung cấp OpenID (không có vấn đề mà một trong tôi sử dụng):

is_valid:true 
ns:http://specs.openid.net/auth/2.0 

... và fox sống của tôi nhận được điều này:

is_valid:false 
ns:http://specs.openid.net/auth/2.0 

Có aren không có bất kỳ ký tự không phải ASCII nào liên quan nên nó không thể là vấn đề mã hóa. Phải có một cái gì đó sai trong dịch vụ lưu trữ của tôi, nhưng tôi chỉ không thể tìm ra những gì.

Tôi cần đề xuất về nguyên nhân có thể và mẹo khắc phục sự cố.

Trả lời

11

Tôi đã phân lập được sự cố và tìm thấy giải pháp thay thế. Phương pháp request() làm cho một số tính năng tự động phát hiện để tìm hiểu làm thế nào để stablish kết nối HTTP:

protected function request($url, $method='GET', $params=array(), $update_claimed_id=false) 
{ 
    if (function_exists('curl_init') 
     && (!in_array('https', stream_get_wrappers()) || !ini_get('safe_mode') && !ini_get('open_basedir')) 
    ) { 
     return $this->request_curl($url, $method, $params, $update_claimed_id); 
    } 
    return $this->request_streams($url, $method, $params, $update_claimed_id); 
} 

Trong hộp dev của tôi là sử dụng CURL nhưng trong hộp sống của tôi nó sử dụng file_get_contents() vì việc kiểm tra thất bại. Lý do là chỉ thị open_basedir không trống.

Nếu tôi buộc LightOpenID sử dụng CURL, mọi thứ sẽ chạy trơn tru.


Update # 1: LightOpenID đã đúng khi quyết định curl đó là không sử dụng được. Tôi thấy điều này trong file log:

CURLOPT_FOLLOWLOCATION không thể được kích hoạt khi safe_mode được kích hoạt hoặc một open_basedir được thiết lập

Đối với các phiên bản file_get_contents(), tôi nghi ngờ tôi đã tìm thấy một lỗi đánh máy trong thư viện:

Index: lightopenid/openid.php 
=================================================================== 
--- lightopenid/openid.php (0.60) 
+++ lightopenid/openid.php (working copy) 
@@ -349,7 +349,7 @@ 
      $this->headers = $this->parse_header_array($http_response_header, $update_claimed_id); 
     } 

-  return file_get_contents($url, false, $context); 
+  return $data; 
    } 

    protected function request($url, $method='GET', $params=array(), $update_claimed_id=false) 

Tôi đã thông báo cho tác giả và anh ấy đã xác nhận đó là lỗi. Tôi sẽ báo cáo lại nếu nó được cố định.

Cập nhật # 2: Lỗi was fixed trong ngành thạc sĩ vào ngày năm 2012. Nó vẫn không nằm trong việc phát hành ổn định nhưng có thể được tải về từ code repository.

+0

Cảm ơn bạn đã sửa chữa. Mặc dù bị trùng lặp, tôi tự hỏi tại sao cuộc gọi thứ hai tới file_get_contents ($ url, false, $ context) bằng $ data không hoạt động? – neobie

+2

Tôi cho rằng bạn chỉ có thể xác thực thành công một cuộc gọi vì lý do bảo mật. –

+0

Nó được gọi là 'nonce' vì một lý do. Đó là mã thông báo một lần. – Maerlyn

0

Chỉ cần chụp trong bóng tối nhưng khi tôi làm việc với OpenID (không lightopenid) nhưng một thư viện cho CodeIgniter, tôi gặp vấn đề tương tự khi quyền của tôi không được đặt chính xác cho thư mục bộ nhớ cache nonce. Có lẽ đây là một vấn đề cho phép lưu trữ đơn giản?

+0

Theo như tôi biết, LightOpenID không sử dụng bộ nhớ. Nhưng tôi đã tìm thấy một sự khác biệt: các máy chủ sống dường như không có CURL có sẵn và LightOpenID sử dụng 'file_get_contents()' thay thế. Tôi sẽ cố gắng tìm hiểu xem nó có liên quan hay không. –

Các vấn đề liên quan