2012-02-03 18 views
8

Ho ottenuto il resto della libreria completamente funzionante, solo cercando di generare le chiavi API e il suo lancio 403 vietato quando eseguito tramite ajax.Libreria API REST CodeIgniter Ajax PUT throwing 403 Forbidden

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

ho tracciato a _remap funzione in REST_Controller .. quasi come se im chiamando l'url in modo errato?

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

Il presente modulo sarebbe sul site1.com dopo essersi registrati per un conto che avrebbero cliccare su "generare chiave".

ajax chiamata:

/** 
* 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 su GitHub: https://github.com/philsturgeon/codeigniter-restserver

sguardo specificamente a key.php sotto application/controllers/api/key.php

frammento del file key.php che dovrebbe riguardare a questo processo:

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

di risposta/intestazioni di richiesta

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 

risposta

3

ho finito per scoprire la 403 proibito era perché non stava fornendo una chiave API per generare chiavi ..

Tipo di abiguous la documentazione di Phil non indica che una chiave API esistente è necessario prima di poter generare chiavi ..

semplicemente creato una chiave falsa nella tabella db e di riferimento che al momento della chiamata/key/index? X-API-KEY = boguskey

+1

Si può semplicemente inserire uno nel database, non è necessario utilizzare il controller di generazione Api se non si desidera. In effetti puoi semplicemente creare chiavi casuali nella tua applicazione e inserirle nel DB in questo modo. È generico e puoi fare quello che ti piace;) –

+0

ho lo stesso problema, io genero una chiave come tu.non funziona, aiutami –

0

Se si chiama questo da un dominio diverso, si può essere in esecuzione in alcuni problemi XSS. Potrebbe essere necessario eseguirlo dal proprio server e chiamare la funzione dal proprio dominio o eventualmente utilizzare la funzionalità JSONP.

AGGIORNAMENTO: È possibile visualizzare la transazione in Firebug utilizzando la scheda NET? Hai indietro JSON? A volte devi aggiungere callback =? alla richiesta di url: http://dev.site1.com/api/key?callback=?

Update2: siete in grado di portare la pagina verso l'alto nel browser: (http://dev.mapitusa.com/api/key) Se si ottiene lo stesso errore, si dovrebbe provare a dare 777 (completo leggi/scrivi) le autorizzazioni per il sito.

+0

codice aggiornato, si fa uso jsonp..and sua svolta dal mio dominio .. – gorelative

+0

domanda aggiornato con più spiegazioni sul flusso di lavoro/scenario – gorelative

+0

aggiunto di risposta/intestazioni di richiesta a mettere in discussione come pure .. – gorelative

0

Sembra che potrebbe trattarsi di un problema del browser. Forse un'implementazione errata di PUT nello stack XMLHttpRequest.

Proverei a convertire rapidamente in POST solo per vedere se funziona. Potrebbe essere meglio lasciarlo come POST comunque solo per motivi di compatibilità.

2

ho risolto il problema di generare api chiave. Sto usando il server API REST di Phil Sturgeon. chiamata il regolatore chiave utilizzando chiamata AJAX come tale:

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

All'interno regolatore chiave: Cerca per funzione _generate_key() e verificare la presenza di $ this-> load-> helper ('sicurezza') ;. l'helper di sicurezza deve essere caricato per il lavoro di do_hash altrimenti si otterrà un errore del server interno di 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 
    } 
} 

Inoltre, si può chiamare http://sitename.com/api/keyindex?X-API-KEY=your_key_here nella barra degli indirizzi del browser, facendo un piccolo cambiamento nel vostro controller chiave è possibile sostituire il nome della funzione index_put con index_get.

Grazie