2012-02-03 12 views
8

मुझे बाकी लाइब्रेरी पूरी तरह से काम कर रही है, बस एपीआई कुंजी उत्पन्न करने की कोशिश कर रहा है और एजेक्स के जरिए निष्पादित होने पर 403 को फेंक दिया गया है।कोडइग्निटर रीस्ट एपीआई लाइब्रेरी अजाक्स पुट फेंकना 403 फॉरबिडन

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

मैं इसे REST_Controller के तहत समारोह _remap लिए .. लगभग रूप में अगर im यूआरएल गलत तरीके से बुला पता लगाया?

कार्यप्रवाह: वे किसी खाते में पंजीकरण के बाद वे क्लिक करेंगे "उत्पन्न कुंजी"user visits site1.com -> registers for account -> generates api key for their domain -> key recorded in db -> key displayed

निम्नलिखित रूप site1.com पर होगा।

ajax कॉल:

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

GitHub पर बाकी सर्वर: के तहत application/controllers/api/key.php

key.php फ़ाइल है कि संबंधित होना चाहिए की स्निपेट key.php पर https://github.com/philsturgeon/codeigniter-restserver

नज़र विशेष रूप से इस प्रक्रिया के लिए:

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

उत्तर

3

मैं 403 निषिद्ध था, क्योंकि मैं एक API कुंजी कुंजी उत्पन्न करने के लिए प्रदान नहीं किया गया था .. फिल के प्रलेखन के रूप में abiguous की

तरह जानने नहीं बताता है एक मौजूदा api कुंजी आप कर सकते हैं इससे पहले कि आवश्यक है कि समाप्त हो गया कुंजी उत्पन्न ..

मैं बस DB में तालिका में एक फर्जी कुंजी बनाया है और संदर्भित है कि जब बुला/कुंजी/सूचकांक? एक्स-एपीआई-कुंजी = boguskey

+1

है, आप केवल डेटाबेस में जाम कर सकते हैं, अगर आप नहीं चाहते हैं तो आप एपीआई पीढ़ी नियंत्रक का उपयोग करने के लिए स्पष्ट रूप से नहीं हैं। असल में आप अपने आवेदन में यादृच्छिक कुंजी बना सकते हैं और उन्हें डीबी में भी फेंक सकते हैं। यह सामान्य है और आप जो भी पसंद कर सकते हैं;) –

+0

मुझे एक ही समस्या है, मैं आपके जैसा कुंजी उत्पन्न करता हूं। मेरा काम नहीं कर रहा है, मेरी मदद करो –

0

आप किसी दूसरे डोमेन से बुला रहे हैं, तो आप कुछ XSS समस्याओं में घिर गए हो सकता है। आपको इसे अपने सर्वर से चलाना पड़ सकता है और फ़ंक्शन को अपने डोमेन से कॉल करना पड़ सकता है या संभवतः जेएसओएनपी क्षमता का उपयोग कर सकता है।

अद्यतन: क्या आप नेट टैब का उपयोग कर फायरबग में लेनदेन देख सकते हैं? क्या आपको जेएसओएन वापस मिल गया है? कभी-कभी आपको कॉलबैक = जोड़ना होगा? यूआरएल अनुरोध के लिए: http://dev.site1.com/api/key?callback=?

Update2: ((http://dev.mapitusa.com/api/key) आप एक ही त्रुटि मिलती है, तो आप 777 दे रही है की कोशिश करनी चाहिए पूर्ण: आप ब्राउज़र में पृष्ठ लाने के लिए सक्षम हैं साइट पर अनुमतियां पढ़ें/लिखें)।

+0

कोड अद्यतन, यह मेरी खुद के डोमेन .. कार्यप्रवाह/परिदृश्य – gorelative

+0

अद्यतन सवाल .. – gorelative

+0

प्रतिक्रिया/अनुरोध हेडर के रूप में अच्छी तरह से सवाल करने के लिए जोड़ा के बारे में अधिक विवरण के साथ – gorelative

0

ऐसा लगता है कि यह एक ब्राउज़र समस्या हो सकती है। शायद XMLHttpRequest स्टैक में PUT का गलत कार्यान्वयन।

मैं यह देखने के लिए कि यह काम करता है, मैं इसे तुरंत पोस्ट में बदलने की कोशिश करूंगा। संगतता उद्देश्यों के लिए इसे किसी भी तरह पोस्ट के रूप में छोड़ना बेहतर हो सकता है।

2

मैं एपीआई पैदा करने की समस्या को हल कर दिया है कुंजी। मैं फिल स्टर्जन के आरईएसटी एपीआई सर्वर का उपयोग कर रहा हूं। कॉल कुंजी नियंत्रक जैसे 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 के लिए खोजें() और $ इस- के लिए> load-> सहायक ('सुरक्षा') की जाँच ;. सुरक्षा सहायक को 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 
    } 
} 

इसके अलावा, आप अपने प्रमुख नियंत्रक में एक छोटा सा परिवर्तन आप index_get साथ index_put समारोह नाम की जगह ले सकता बनाकर अपने ब्राउज़र के एड्रेस बार में http://sitename.com/api/keyindex?X-API-KEY=your_key_here कह सकते हैं।

धन्यवाद

संबंधित मुद्दे