Php CodeIgniter REST API库Ajax禁用403

Php CodeIgniter REST API库Ajax禁用403,php,ajax,codeigniter,rest,Php,Ajax,Codeigniter,Rest,我让库的其余部分充分工作,只是尝试生成api键,并在通过ajax执行时抛出403 ({“status”:false,“error”:“无效的API密钥”。}) 我追踪到REST\u控制器下的_remap函数。。就好像我没有正确地调用url一样 工作流:用户访问site1.com->注册帐户->为其域生成api密钥->数据库中记录的密钥->显示的密钥 以下表格将在site1.com上,在他们注册帐户后,他们将单击“生成密钥” ajax调用: /** * Generate an API Key f

我让库的其余部分充分工作,只是尝试生成api键,并在通过ajax执行时抛出403

({“status”:false,“error”:“无效的API密钥”。})

我追踪到REST\u控制器下的_remap函数。。就好像我没有正确地调用url一样

工作流:
用户访问site1.com->注册帐户->为其域生成api密钥->数据库中记录的密钥->显示的密钥

以下表格将在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]);
            };
        }
    });
 });
/**
 * 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
    }
}
GitHub上的REST-SERVER:

具体查看
application/controllers/api/key.php下的key.php

应与此过程相关的key.php文件片段:

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

如果您是从其他域调用它,可能会遇到一些XSS问题。您可能必须从自己的服务器运行它,并从自己的域调用函数,或者可能使用JSONP功能

更新:您是否能够使用NET选项卡在Firebug中查看事务? 你回来了吗? 有时您必须添加callback=?要访问url请求,请执行以下操作: ?

更新2:您是否能够在浏览器中打开页面:(http://dev.mapitusa.com/api/key)
如果您遇到相同的错误,您应该尝试授予该站点777(完全读/写)权限。

这听起来可能是浏览器问题。可能是XMLHttpRequest堆栈中的PUT实现不正确


我会尝试将它快速转换为POST,看看它是否有效。出于兼容性目的,最好还是将其保留为POST。

我最终发现403被禁止是因为我没有提供api密钥来生成密钥

Phil的文档并没有说明在生成密钥之前需要一个现有的api密钥


我只是在db的表中创建了一个伪键,并引用了调用/key/index?X-API-key=boguskey时,我已经解决了生成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->load->helper('security');。必须加载安全帮助程序才能使用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\u get替换函数名index\u put


感谢

更新了问题,并提供了更多关于工作流/场景的解释。当我打开api/键时,它的触发索引\u get而不是索引\u put,这样就不可能了……页面将无法通过直接调用api URL作为其查找put头和not get来工作。我需要模仿PUT,以便挑出ajax。这些文件确实有777个chmod。您可以将一个chmod插入数据库,如果不想,您不必显式地使用api生成控制器。事实上,您可以在应用程序中创建随机键,并以这种方式将它们扔到数据库中。它是通用的,你可以随心所欲;)我也有同样的问题,我和你一样生成了一个密钥。我的密钥不起作用,请帮帮我