2012-02-03 4 views
8

Kütüphanenin geri kalanı tamamen çalıştım, sadece api anahtarları oluşturmaya çalışıyorum ve ajax ile çalıştırıldığında 403'ü yasaklıyorum. CodeIgniter REST API Kütüphanesi Ajax PUT throwing 403 Yasak

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

ben neredeyse yanlış url çağıran im sanki .. REST_Controller altında işlevini _remap kadar takip?

iş akışı: onlar "anahtarı oluşturmak" tıklıyorsunuz, bir hesapta kaydolduktan sonrauser visits site1.com -> registers for account -> generates api key for their domain -> key recorded in db -> key displayed

aşağıdaki formu site1.com olurdu.

ajax çağrısı: GitHub üzerinde

/** 
* 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 SUNUCU: ilgili olmalıdır key.php dosyasının application/controllers/api/key.php

Snippet'ine altında key.php de özellikle https://github.com/philsturgeon/codeigniter-restserver

bakış bu işlem için:

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

Tepki/İstek Başlıkları

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 

cevap

3

i varolan api anahtarı yapabilirsiniz önce gerekli olduğunu ortaya koyan gelmez i anahtarları oluşturmak için bir API anahtarı sağlayarak değildi çünkü idi yasak 403 .. Phil belgelerine olarak abiguous ait

Kind bulmaya sona erdi

sadece/anahtar/index çağırarak? X-API-kEY = boguskey

+1

Sadece veritabanına bir tane sıkışabilir, istemiyorsanız api üretimi denetleyicisini kullanmak için kesinlikle VAR. Aslında uygulamanızda rastgele anahtarlar oluşturabilir ve bunları da DB'ye atabilirsiniz. Bu jenerik ve sen ne istersen yapabilirsin;) –

+0

Bende aynı problem var, sen çalışana bir anahtar üretiyorum, bana yardım et –

0

farklı bir etki alanından bu aradığınız, bazı XSS ​​sorunları çalışıyor olabilir. Kendi sunucunuzdan çalıştırmanız ve kendi alan adındaki işlevi çağırmanız veya muhtemelen JSONP özelliğini kullanmanız gerekebilir.

UPDATE: Nesneyi Firebug'da NET Sekmesini kullanarak görebiliyor musunuz? JSON Geri Aldınız mı? Bazen, callback =? url isteği için: http://dev.site1.com/api/key?callback=?

Update2: Tam (aynı hata alırsanız (http://dev.mapitusa.com/api/key) , sen 777 vererek denemelisiniz: tarayıcıda sayfasını getirmek yapabiliyor musunuz siteye okuma/yazma) izinleri.

+0

kod güncellenen, bu benim kendi etki .. – gorelative

+0

güncellenen soru .. – gorelative

+0

yanıt/istek başlıklarını yanı sorgulamaya eklenen iş akışı/senaryo üzerinde daha açıklama ile – gorelative

0

Bu, tarayıcı sorunu gibi görünüyor. Belki de XMLHttpRequest yığında PUT yanlış bir uygulama.

İşe yarayıp yaramadığını görmek için hemen POST'a dönüştürmeyi deneyebilirim. Sadece uyumluluk amacıyla zaten POST olarak bırakarak daha iyi olabilir.

2

Ben api hazırlama sorununu çözmüş db tablosunda bir sahte anahtar oluşturulan ve başvurulan .. anahtarları oluşturmak tuşuna basın. Phil Sturgeon'un REST API sunucusunu kullanıyorum. Çağrı gibi ajax çağrısı kullanarak anahtar kontrolör: anahtar denetleyici İçinde

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

: fonksiyon _generate_key için Arama() ve $ this- için> load-> yardımcı ('güvenlik') kontrol ;. Do_hash'ın çalışması için güvenlik yardımcısı yüklenmelidir, aksi takdirde 500 dahili sunucu hatası alırsınız.

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

Ayrıca, size index_get ile index_put işlev adı yerine anahtar denetleyicisi küçük bir değişiklik yaparak tarayıcınızın adres çubuğuna http://sitename.com/api/keyindex?X-API-KEY=your_key_here çağırabilir.

Teşekkür