Библиотека API REST CodeIgniter Ajax PUT throwing 403 Запрещено - PullRequest
8 голосов
/ 03 февраля 2012

У меня остальная библиотека работает полностью, я просто пытаюсь сгенерировать ключи API и выдает 403 запрещенных при выполнении через ajax.

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

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

рабочий процесс: 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/codeigniter-restserver

lookв частности, в 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

Ответы [ 4 ]

3 голосов
/ 10 февраля 2012

В итоге я обнаружил, что запрет 403 объясняется тем, что я не предоставлял ключ API для генерации ключей.

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

Я просто создал поддельный ключ в таблице в БД и сослался на то, что при вызове / key / index? X-API-KEY = boguskey

2 голосов
/ 18 сентября 2014

Я решил проблему генерации ключа API.Я использую сервер REST API Фила Стерджена.Вызовите контроллер ключа с помощью вызова 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-> helper ('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.

Спасибо

0 голосов
/ 09 февраля 2012

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

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

0 голосов
/ 03 февраля 2012

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

ОБНОВЛЕНИЕ: Можете ли вы видеть транзакцию в Firebug с помощью вкладки NET?Ты возвращаешь JSON?Иногда вам нужно добавить callback =?на запрос URL: http://dev.site1.com/api/key?callback=?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...