Библиотека API REST CodeIgniter Ajax PUT throw 403 Запрещено

Я оставил всю библиотеку, полностью работающую, просто пытаясь генерировать ключи api и бросать запрещенный 403 при выполнении через ajax.

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

Я проследил его до функции _remap под REST_Controller .. почти так, как если бы я неправильно вызывал URL-адрес?

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

Следующая форма будет на site1.com после регистрации для учетной записи, которую они нажмут «сгенерировать ключ».

ajax call:

 /** * 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 на GitHub: https://github.com/philsturgeon/codeigniterrestserver

посмотрите конкретно на key.php в application/controllers/api/key.php

Фрагмент файла key.php, который должен относиться к этому процессу:

 /** * 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 } } 

Заголовок ответа / запроса

 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 

Solutions Collecting From Web of "Библиотека API REST CodeIgniter Ajax PUT throw 403 Запрещено"

я закончил тем, что выяснил, что запрещен 403, потому что я не предоставлял ключ api для генерации ключей ..

Вид нелепо, как документация Фила, не указывает, что для создания ключей требуется существующий ключ api.

Я просто создал фиктивный ключ в таблице в db и указал, что при вызове / ключевом / индексе? X-API-KEY = boguskey

Я решил проблему генерации ключа api. Я использую сервер API REST от Phil Sturgeon. Вызовите контроллер клавиатуры с помощью ajax-вызова как такового:

 $("#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]); }; } }); }); 

Внутренний контроллер клавиатуры: найдите функцию _generate_key () и установите для справки $ this-> load-> ('security') ;. помощник безопасности должен быть загружен для работы do_hash, иначе вы получите 500 внутренних ошибок сервера.

 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 } } 

Кроме того, вы можете вызвать http://sitename.com/api/keyindex?X-API-KEY=your_key_here в адресной строке браузера, внеся небольшое изменение в ваш контроллер ключей, вы можете заменить имя функции index_put на index_get.

благодаря

Если вы вызываете это из другого домена, вы можете столкнуться с некоторыми проблемами XSS. Возможно, вам придется запускать его со своего сервера и вызывать функцию из своего собственного домена или, возможно, использовать возможности JSONP.

UPDATE: Вы можете видеть транзакцию в Firebug с помощью вкладки NET? Вы получаете JSON Back? Иногда вам нужно добавить callback =? на запрос URL: http://dev.site1.com/api/key?callback= ?

Update2: можете ли вы довести страницу вверх в браузере: (http://dev.mapitusa.com/api/key) Если вы получаете ту же ошибку, попробуйте дать 777 (полный доступ для чтения / записи) к сайт.

Это похоже на проблему с браузером. Возможно, некорректная реализация PUT в стеке XMLHttpRequest.

Я бы попытался быстро преобразовать его в POST, чтобы убедиться, что он работает. Возможно, было бы лучше оставить его как POST в любом случае только для целей совместимости.