2012-02-03 21 views
8

Obtuve el resto de la biblioteca trabajando completamente, solo tratando de generar claves api y arrojando un 403 prohibido cuando se ejecuta a través de ajax.CodeIgniter REST API Library Ajax PUT throwing 403 Forbidden

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

que remontar a la función _remap bajo REST_Controller .. casi como si im llamando a la url de forma incorrecta?

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

La forma siguiente estaría en site1.com tras su registro en una cuenta que les haga clic en "Generar clave".

ajax llamada:

/** 
* 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]); 
      }; 
     } 
    }); 
}); 

RESTO-SERVER en GitHub: https://github.com/philsturgeon/codeigniter-restserver

mirada específicamente a key.php bajo application/controllers/api/key.php

de fragmentos del archivo key.php que debe relacionarse a este proceso:

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

de respuesta/petición encabezados

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 

Respuesta

3

terminé descubriendo el 403 prohibido era porque no estaba dando una clave de API para generar claves ..

tipo de abiguous como documentación de Phil no dice que se requiere una clave de API existente antes de que pueda generar claves ..

simplemente crearon una clave falsa en la tabla en el PP y se hace referencia que al llamar/clave/index? X-API-KEY = boguskey

+1

. Simplemente puede meter uno en la base de datos, no TIENE que usar explícitamente el controlador de generación api si no lo desea. De hecho, puede simplemente hacer claves aleatorias en su aplicación e incluirlas en el DB de esa manera también. Es genérico y puedes hacer lo que quieras;) –

+0

tengo el mismo problema, genero una clave a medida que tu.mina no funciona, ayúdame –

0

Si se llama a esto desde un dominio diferente, puede que esté ejecutando en algunas cuestiones XSS. Es posible que deba ejecutarlo desde su propio servidor y llamar a la función desde su propio dominio o, posiblemente, utilizar la capacidad JSONP.

ACTUALIZACIÓN: ¿Puede ver la transacción en Firebug usando la pestaña NET? ¿Le devuelven JSON? Algunas veces tienes que agregar callback =? a la solicitud de URL: http://dev.site1.com/api/key?callback=?

Update2: ¿Es capaz de llevar a la página en el navegador: (http://dev.mapitusa.com/api/key) Si se obtiene el mismo error, debe intentar dar 777 (completa leer/escribir) permisos para el sitio.

+0

código actualizado, que hace uso de su jsonp..and corrió de mi propio dominio .. – gorelative

+0

pregunta actualizada con más explicaciones sobre el flujo de trabajo/escenario – gorelative

+0

añadieron respuesta/cabeceras de petición a la pregunta, así .. – gorelative

0

Parece que es un problema del navegador. Tal vez una implementación incorrecta de PUT en la pila XMLHttpRequest.

Intentaré convertirlo rápidamente a POST solo para ver si funciona. Sería mejor dejarlo como POST de todos modos solo por razones de compatibilidad.

2

he resuelto el problema de la generación de la API llave. Estoy usando el servidor de API REST de Phil Sturgeon. el controlador de llamadas usando la llamada ajax clave tales como:

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

Dentro de Control de tono: Buscar _generate_key() y comprobar si hay $ this-> load-> helper ('seguridad') ;. el asistente de seguridad debe cargarse para trabajar con do_hash; de lo contrario, obtendrá un error interno de 500 servidores.

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

Además, puede llamar a http://sitename.com/api/keyindex?X-API-KEY=your_key_here en la barra de direcciones del navegador al hacer un pequeño cambio en su controlador clave puede reemplazar el nombre de la función index_put con index_get.

Gracias