2012-02-03 32 views
8

Tôi nhận được phần còn lại của thư viện hoạt động đầy đủ, chỉ cần cố gắng tạo khóa api và ném 403 bị cấm khi thực hiện qua ajax.Thư viện API REST CodeIgniter Ajax PUT ném 403 Bị cấm

({"status":false,"error":"Invalid API Key."})

tôi truy tìm nó để _remap chức năng dưới REST_Controller .. như thể im gọi url không đúng cách?

workflow:user visits site1.com -> registers for account -> generates api key for their domain -> key recorded in db -> key displayed

Các hình thức sau đây sẽ là trên site1.com sau khi họ đăng ký tài khoản họ sẽ bấm vào nút "tạo ra chìa khóa".

gọi ajax:

/** 
* Generate an API Key for Us to use 
*/ 

$("#submitGetApiKey").click(function(){ 
    $.ajax({ 
     url: "http://dev.site1.com/api/key", 
     crossDomain: true, 
     type: "PUT", 
     dataType: "jsonp", 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 
      alert(errorThrown); 
     }, 
     success: function(data){ 
      for (var i = keys.length - 1; i >= 0; i--) { 
       console.log(keys[i]); 
      }; 
     } 
    }); 
}); 

REST SERVER trên GitHub: https://github.com/philsturgeon/codeigniter-restserver

cái nhìn đặc biệt tại key.php dưới application/controllers/api/key.php

Snippet của tập tin key.php rằng nên liên hệ cho quá trình này:

/** 
* Key Create 
* 
* Insert a key into the database. 
* 
* @access public 
* @return void 
*/ 
public function index_put() 
{ 
    // Build a new key 
    $key = self::_generate_key(); 

    // If no key level provided, give them a rubbish one 
    $level = $this->put('level') ? $this->put('level') : 1; 
    $ignore_limits = $this->put('ignore_limits') ? $this->put('ignore_limits') : 1; 

    // Insert the new key 
    if (self::_insert_key($key, array('level' => $level, 'ignore_limits' => $ignore_limits))) 
    { 
     $this->response(array('status' => 1, 'key' => $key), 201); // 201 = Created 
    } 

    else 
    { 
     $this->response(array('status' => 0, 'error' => 'Could not save the key.'), 500); // 500 = Internal Server Error 
    } 
} 

đáp ứng/Request Headers

Request URL:http://dev.mapitusa.com/api/key 
Request Method:PUT 
Status Code:403 Forbidden 
Request Headersview source 
Accept:application/json, text/javascript, */*; q=0.01 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Content-Length:0 
Cookie:ci_session=a%3A4%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22e165df34aa4fda5936e940658030f83d%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A118%3A%22Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_7_3%29+AppleWebKit%2F535.19+%28KHTML%2C+like+Gecko%29+Chrome%2F18.0.1025.3+Safari%2F535.19%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1328291821%3B%7Dac0f163b112dbd3769e67f4bb7122db2 
Host:dev.mapitusa.com 
Origin:http://dev.mapitusa.com 
Referer:http://dev.mapitusa.com/api_test.html 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.3 Safari/535.19 
Response Headersview source 
Cache-Control:max-age=0, public 
Connection:Keep-Alive 
Content-Encoding:gzip 
Content-Length:69 
Content-Type:application/json 
Date:Fri, 03 Feb 2012 18:03:54 GMT 
Expires:Fri, 03 Feb 2012 18:03:54 GMT 
Keep-Alive:timeout=5, max=98 
Server:Apache 
Set-Cookie:ci_session=a%3A4%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22f2f466f7b97b89f2a9b557d2d9a0dbcc%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A118%3A%22Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_7_3%29+AppleWebKit%2F535.19+%28KHTML%2C+like+Gecko%29+Chrome%2F18.0.1025.3+Safari%2F535.19%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1328292234%3B%7D6821b96c7e58b55f1767eb265ffdb79e; expires=Fri, 03-Feb-2012 20:03:54 GMT; path=/ 
Status:403 
Vary:Accept-Encoding,User-Agent 
X-Powered-By:PHP/5.3.6 
X-UA-Compatible:IE=Edge,chrome=1 

Trả lời

3

tôi đã kết thúc việc tìm kiếm ra 403 cấm là vì tôi đã không cung cấp một phím api để tạo ra các phím ..

Loại abiguous như tài liệu Phil không nêu rằng một phím api hiện được yêu cầu trước khi bạn có thể tạo ra các phím ..

tôi chỉ đơn giản là tạo ra một chìa khóa giả trong bảng trong db và tham chiếu rằng khi gọi/khóa/index? X-API-kEY = boguskey

+1

Bạn chỉ có thể kẹt vào cơ sở dữ liệu, bạn không rõ ràng CÓ sử dụng bộ điều khiển thế hệ api nếu bạn không muốn. Trong thực tế, bạn chỉ có thể tạo các khóa ngẫu nhiên trong ứng dụng của bạn và ném chúng vào DB theo cách đó. Nó là chung chung và bạn có thể làm những gì bạn thích;) –

+0

tôi có cùng một vấn đề, tôi tạo ra một khóa như you.mine không làm việc, giúp tôi –

0

Nếu bạn đang gọi này từ một tên miền khác nhau, bạn có thể chạy vào một số vấn đề XSS. Bạn có thể phải chạy nó từ máy chủ của riêng bạn và gọi hàm đó từ miền riêng của nó hoặc có thể sử dụng khả năng JSONP.

CẬP NHẬT: Bạn có thể xem giao dịch trong Firebug bằng cách sử dụng Tab NET không? Bạn có nhận lại JSON không? Đôi khi bạn phải thêm gọi lại =? vào yêu cầu url: http://dev.site1.com/api/key?callback=?

Update2: Bạn có thể mang lại the page up trong trình duyệt: (http://dev.mapitusa.com/api/key) Nếu bạn nhận được lỗi tương tự, bạn nên cố gắng đưa ra 777 (đầy đủ đọc/ghi) quyền truy cập vào trang web.

+0

đang được cập nhật, nó sử dụng jsonp..and ran từ miền của riêng tôi .. – gorelative

+0

cập nhật câu hỏi với lời giải thích thêm về các quy trình làm việc/kịch bản – gorelative

+0

thêm phản ứng/tiêu đề yêu cầu đặt câu hỏi cũng .. – gorelative

0

Điều này có vẻ như đây có thể là sự cố trình duyệt. Có thể triển khai PUT không chính xác trong ngăn xếp XMLHttpRequest.

Tôi sẽ thử chuyển đổi nhanh chóng thành POST chỉ để xem nó có hoạt động không. Nó có thể là tốt hơn để lại nó như POST anyway chỉ cho mục đích tương thích.

2

tôi đã giải quyết được vấn đề tạo ra các api Chìa khóa. Tôi đang sử dụng máy chủ REST API của Phil Sturgeon. Gọi bộ điều khiển chính sử dụng cuộc gọi ajax như vậy:

$("#submitGetApiKey").click(function(){ 
    $.ajax({ 
     url: "http://sitename.com/api/key/index?X-API-KEY=your_key_here", 
     crossDomain: true, /* remove this if using the same domain*/ 
     type: "PUT", 
     dataType: "jsonp", 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 
      alert(errorThrown); 
     }, 
     success: function(data){ 
      for (var i = keys.length - 1; i >= 0; i--) { 
       console.log(keys[i]); 
      }; 
     } 
    }); 
}); 

Bên trong bộ điều khiển chính: Tìm kiếm chức năng _generate_key() và kiểm tra với $ this-> tải-> helper ('an ninh') ;. trình trợ giúp bảo mật phải được tải để làm việc do_hash nếu không, bạn sẽ nhận được 500 lỗi máy chủ nội bộ.

public function index_put() 
{ 
    // Build a new key 
    $key = self::_generate_key(); 

    // If no key level provided, give them a rubbish one 
    $level = $this->put('level') ? $this->put('level') : 1; 
    $ignore_limits = $this->put('ignore_limits') ? $this->put('ignore_limits') : 1; 

    // Insert the new key 
    if (self::_insert_key($key, array('level' => $level, 'ignore_limits' => $ignore_limits))) 
    { 
     $this->response(array('status' => 1, 'key' => $key), 201); // 201 = Created 
    } 

    else 
    { 
     $this->response(array('status' => 0, 'error' => 'Could not save the key.'), 500); // 500 = Internal Server Error 
    } 
} 

Ngoài ra, bạn có thể gọi http://sitename.com/api/keyindex?X-API-KEY=your_key_here trong thanh địa chỉ của trình duyệt của bạn bằng cách làm cho một sự thay đổi nhỏ trong bộ điều khiển chìa khóa của bạn bạn có thể thay tên hàm index_put với index_get.

Cảm ơn

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