【问题标题】:SharePoint REST Query returns 403 forbidden errorSharePoint REST 查询返回 403 禁止错误
【发布时间】:2020-10-17 08:58:21
【问题描述】:

我正在尝试使用 REST API 和 JQuery 将文件上传到 SharePoint 目录。 参考:https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/upload-a-file-by-using-the-rest-api-and-jquery

我正在尝试从 chrome 浏览器控制台运行以下代码。

var CreateNewList = function() {
    var fileName = "test1.txt";
    var reader = new FileReader();
    var arrayBuffer = reader.result;
    var serverUrl = "https://{site}.sharepoint.com/";
    var serverRelativeUrlToFolder = 'SampleDocuments/Folder1';
    // Construct the endpoint.
    var fileCollectionEndpoint = String.format(
            "{0}/_api/web/getfolderbyserverrelativeurl('{1}')/files" +
            "/add(overwrite=true, url='{2}')",
            serverUrl, serverRelativeUrlToFolder, fileName); 

    return jQuery.ajax({
        url: fileCollectionEndpoint,
        type: "POST",
        data: arrayBuffer,
        processData: false,
        headers: {
          "accept": "application/json;odata=verbose",
          "X-RequestDigest": jQuery("#__REQUESTDIGEST").val()
        }
    });
 };

String.format = function() {
            var s = arguments[0];
            for (var i = 0; i < arguments.length - 1; i += 1) {
                var reg = new RegExp('\\{' + i + '\\}', 'gm');
                s = s.replace(reg, arguments[i + 1]);
            }
            return s;
        };

当我在 SharePoint 页面上运行时,上面的代码运行良好。但是当我从不同的网页尝试时,相同的代码不起作用,这意味着代码在同一个域上可以正常工作,但在不同的域上却不行。

因此,尝试了另一个示例(来自上述 URL 的示例 1),即跨域上传文件。

function addFileToFolder() {
      var fileName = "test1.txt";
      var reader = new FileReader();
      var arrayBuffer = reader.result;
      var serverRelativeUrlToFolder = 'SampleDocuments/Folder1';

      var appWebUrl = "https://{site}.sharepoint.com";
      var hostWebUrl = "https://{site}.sharepoint.com";

      var fileCollectionEndpoint = String.format(
         "{0}/_api/sp.appcontextsite(@target)/web/getfolderbyserverrelativeurl('{1}')/files" +
         "/add(overwrite=true, url='{2}')?@target='{3}'",
         appWebUrl, serverRelativeUrlToFolder, fileName, hostWebUrl);

      return jQuery.ajax({
         url: fileCollectionEndpoint,
         type: "POST",
         data: arrayBuffer,
         processData: false,
         headers: {
                "accept": "application/json;odata=verbose",
                "X-RequestDigest": jQuery("#__REQUESTDIGEST").val()
         }
      });
 }

此代码在任何域中都不起作用(在 SharePoint 页面和其他页面中均失败)并返回 403 Forbidden 错误:

error:
code: "-2147024891, System.UnauthorizedAccessException"
message:
lang: "en-US"
value: "Access denied. You do not have permission to perform this action or access this resource."

我尝试从下面的方法中获取 appWebUrl 和 hostWebUrl,但是返回的值是未定义的,所以只是在代码中硬编码了这些值。

  // Get the add-in web and host web URLs.
  appWebUrl = decodeURIComponent(getQueryStringParameter("SPAppWebUrl"));
  hostWebUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));

  function getQueryStringParameter(paramToRetrieve) {
     var params =
     document.URL.split("?")[1].split("&");
     var strParams = "";
     for (var i = 0; i < params.length; i = i + 1) {
        var singleParam = params[i].split("=");
        if (singleParam[0] == paramToRetrieve)
           return singleParam[1];
     }
  }

谁能帮我解决这个问题?

【问题讨论】:

    标签: javascript jquery ajax rest sharepoint


    【解决方案1】:

    你需要知道api场景如何使用。

    其余的 api 在 SharePoint 页面中工作,因为请求将使用当前用户身份验证来访问 SharePoint,它不会在不同的域页面中工作,因为没有身份验证。

    在 SharePoint 加载项解决方案中使用的 SPAppWebUrl/SPHostUrl。

    您必须遵循身份验证流程来验证您从其他应用程序访问 SharePoint 的请求。 https://www.c-sharpcorner.com/article/access-sharepoint-online-rest-api-via-postman-with-user-context/

    【讨论】:

    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    相关资源
    最近更新 更多