2012-02-03 16 views
8

ライブラリの残りの部分は完全に動作し、apiキーを生成しようとしています。CodeIgniter REST APIライブラリAjax PUT throwing 403 Forbidden

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

私はイムが誤ったURLを呼び出し、ほとんどかのように。.. REST_Controllerの下で機能を_remapするためにそれをトレースし?

ワークフロー:彼らは「キーを生成する」をクリックしますアカウントを登録した後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の上REST-SERVER:https://github.com/philsturgeon/codeigniter-restserver

が関係すべき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 

答えて

3

私はフィルのマニュアルとしてabiguousの

種類は、あなたができる前に、既存のAPIキーが必要になると述べているしません..私は鍵を生成するためのAPIキーを提供していなかったため、禁止403だった見つけ出すことになりました私は単純にDB内のテーブルで偽のキーを作成し、boguskey

+1

データベースにジャムすることはできますが、そうしたくない場合は、明示的にAPI生成コントローラを使用する必要はありません。実際には、アプリケーション内でランダムなキーを作成し、そのようにDBに投げることができます。それは一般的なもので、あなたが好きなことをすることができます;) –

+0

私は同じ問題を抱えています。 –

0

あなたは、いくつかのXSSの問題に実行してもよいし、異なるドメインからこれを呼び出している場合。独自のサーバーから実行し、独自のドメインから関数を呼び出すか、おそらくJSONP機能を使用する必要があります。

更新: [NET]タブを使用してFirebugでトランザクションを確認できますか? JSON Backを取得していますか? 時にはコールバック=を追加する必要がありますか? URLリクエストに: http://dev.site1.com/api/key?callback=

アップデート2:あなたは、ブラウザでページを起動することができています:(http://dev.mapitusa.com/api/key) あなたは、同じエラーが出た場合、あなたは完全な(777を与えてみてください読み取り/書き込み)権限をサイトに付与します。

+0

コードが更新され、それは私自身のドメイン.. – gorelative

+0

更新質問.. – gorelative

+0

は、応答/要求ヘッダが同様に質問するために追加のワークフロー/シナリオの詳細な説明と – gorelative

0

これはブラウザの問題のようです。おそらく、XMLHttpRequestスタック内のPUTの不正な実装です。

私はすぐにそれが動作するかどうかを確認するためにそれをPOSTに変換しようとします。とにかく互換性の目的のためだけにPOSTとして残しておくほうが良いかもしれません。

2

=?X-API-KEY /キー/インデックスを呼び出すときに、私は、APIを生成する問題を解決したことを参照さ

に...キーを生成キー。 Phil Sturgeonの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 - のために>ロード - >ヘルパー(「セキュリティ」)をチェックし;. 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を呼び出すことができます。

おかげ