【问题标题】:Rest api call from jquery ajax gives error 403 Forbidden来自 jquery ajax 的 Rest api 调用给出错误 403 Forbidden
【发布时间】:2015-11-23 00:26:08
【问题描述】:

我正在尝试对 API 进行简单的 jquery ajax 调用

我的代码:

     jQuery.ajax({
         type: "GET",
         url: "http://example.com/api/v1/testapi",
         headers: { "Authorization": "Basic Ylc5aWXXXXXXlk1ucWx5ZnA=" },
         success: function (data, status) {
             // do something
         },

         error: function (status) {
             // error handler
         }
});

请求标头:

OPTIONS /api/v1/testapi HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://localhost
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization
Connection: keep-alive

响应标头:

HTTP/1.1 403 Forbidden
Date: Fri, 28 Aug 2015 10:43:01 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
Cache-Control: no-cache
access-control-allow-headers: origin, content-type, accept
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, PUT, DELETE
access-control-allow-credentials: 1
X-Debug-Token: 0346f5
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

Api 与邮递员一起工作,但当我从 JQuery ajax 调用它时出现错误 403 Forbidden

【问题讨论】:

    标签: javascript php jquery ajax rest


    【解决方案1】:

    将该代码粘贴到您的 Web 服务主页上方。

    if (isset($_SERVER['HTTP_ORIGIN'])) 
    {
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }
    
    
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') 
    {
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");         
    
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    
    }
    

    【讨论】:

    • 网络服务网址是实时的还是本地的?如果它是现场的,你能提供给我吗?
    【解决方案2】:

    AJAX 请求必须在 same domain 内。 我在 Firefox 中尝试了相同的操作,并收到错误消息,因为它是跨域 AJAX 调用。

    Cross-Origin Request Blocked: The Same Origin Policy disallows reading 
    the remote resource at http://example.com/api/v1/testapi.
    (Reason: CORS header 'Access-Control-Allow-Origin' missing)
    

    看起来您正在通过 JS 设置授权标头。调用您的服务器会更安全,这反过来通过设置授权标头来进行 API 调用,这样它就不会暴露在浏览器中。

    【讨论】:

      【解决方案3】:

      发生这种情况是因为X-RequestDigest 已过期或无效,因此您需要在调用 REST 之前调用以下方法

      UpdateFormDigest(_spPageContextInfo.webServerRelativeUrl, _spFormDigestRefreshInterval);
      

      参考:http://sharepointsanjay.blogspot.com/2016/05/how-to-refresh-request-digest-token.html

      【讨论】:

        猜你喜欢
        • 2012-02-26
        • 2019-05-26
        • 1970-01-01
        • 1970-01-01
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多