1

私はSPOでWeb APIの作業をしたいです。 https://blogs.msmvps.com/windsor/2017/03/12/walkthrough-building-a-custom-web-api-for-use-with-sharepoint-online/のサンプルコードを実行しても問題なく動作します。SharepointオンラインWeb Apiベアラーエラー401

これで、オンプレミスとしても機能するSPOへのget-Requestを追加したいと考えています。 clientcontextとWebclientを使ってファイルを読み込もうとしましたが、これは私が好むものです。 しかし、私はいつも401エラーを受け取ります。 "リモートサーバは不正なエラー(401)を返しました"

私は401エラーを理解できません。違いは見られません。ここで

 public async Task<IEnumerable<string>> GetUserInfo(string sharePointUrl) 
    { 
     var results = new List<string>(); 

     try 
     { 
      var userToken = this.Request.Headers.Authorization.Parameter; 
      var newToken = await GetSharePointAccessToken(sharePointUrl, userToken); 

      using (var context = new ClientContext(sharePointUrl)) 
      { 
       context.ExecutingWebRequest += 
        (s, e) => e.WebRequestExecutor.WebRequest.Headers.Add(
        "Authorization", "Bearer " + newToken); 

       var web = context.Web; 
       var user = web.CurrentUser; 
       context.Load(user); 
       context.ExecuteQuery(); 

       results.Add(user.Title); 
       results.Add(user.LoginName); 
       results.Add(user.Email); 
      } 
     } 
     catch (Exception ex) 
     { 
      results.Add(ex.ToString()); 
     } 

     return results; 
    } 

は私のコードスニペットです:

 public async Task<IEnumerable<LessVariables>> GetLess(string url, string id) 
    { 
     [...] 

     var list = new List<LessVariables>(); 

     try 
     { 
      var userToken = this.Request.Headers.Authorization.Parameter; 
      var newToken = await GetSharePointAccessToken(url, userToken); 
      var siteUrl = url; 
      var file = siteUrl + "/Style Library/xxx/less/" + id + ".less"; 
      var files = "/Style Library/xxx/less/" + id + ".less"; 

      using (var context = new ClientContext(url)) 
      { 
       context.ExecutingWebRequest += 
        (s, e) => e.WebRequestExecutor.WebRequest.Headers.Add(
        "Authorization", "Bearer " + newToken); 
       context.AuthenticationMode = ClientAuthenticationMode.Default; 
       context.ExecuteQuery(); 
       var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, files); 

// After this line I get the 401 error 


       using (WebClient client = new WebClient()) 
       { 
        client.Headers[HttpRequestHeader.Authorization] = "Bearer " + newToken; 
        //client.UseDefaultCredentials = true; 
        string s = client.DownloadString(file); 

// After try to DownloadString I got the 401 error. 

        var regex = new Regex(@"(?<name>[@].*:)\s(?<value>.*)(;)"); 
        var matches = regex.Matches(s); 
        var parameters = new List<KeyValuePair<string, string>>(); 

        foreach (var match in matches.Cast<Match>()) 
        { 
         list.Add(new LessVariables 
         { 
          key = match.Groups["name"].Value, 
          value = match.Groups["value"].Value 
         }); 
        } 
       } 
      } 
      return list; 
     } 
     catch (Exception ex) 
     { [...] 

     } 
    } 
+0

がIは、テスト目的で使用、SPO上のコードをテストするために 'client.Credentials =新しいSharePointOnline資格証明(username、passWord); ' コードは正常で、すべて動作しますが、資格情報を使用したくありません。 APIはトークンによって認証されなければなりません。 –

答えて

1

ファイルを読みながらあなたは、この動作が発生している理由は、要求http://<site url>//<folder name>/<file name>原因はリダイレクトが、WebClientは(例えばベアラトークンなど)の認可ヘッダを取り除くことであるとき、リダイレクトに続いて同様の動作はthis postで説明されています。

は、SharePoint Onlineをターゲットにしているので、あなたはは、SharePoint REST APIを使用して、たとえば、リダイレクトを起こさないという異なるアプローチを使用してファイルの内容を取得することができ、具体的には以下のFile resourceエンドポイント:

Url: http://<site url>/_api/web/getfilebyserverrelativeurl('/<folder name>/<file name>')/$value 
Method: Get 

using (var client = new WebClient()) 
{ 
    client.Headers[HttpRequestHeader.Authorization] = "Bearer " + accessToken;  
    var content = client.DownloadString("https://contoso.sharepoint.com/_api/web/getfilebyserverrelativeurl('/Shared%20Documents/Guide.docx')/$value"); 
    //...  
} 
+1

ありがとう!私は完全なuriを使用してリダイレクトを行ったことを知らなかった。私が正しく理解すれば、SPOを使用するときにSharePoint REST APIを使用する必要がありますか? –

+0

REST APIを使用する必要はありませんが、別のAPI(CSOM、RPC)は引き続き使用できます。しかし、OAuthベアラトークンと上記の制限を介して認証するための要件を考えると、RESTはここでファイルをダウンロードする方法だと思います。 –

+0

あなたの答えに感謝します。最後に、私はWeb APIを呼び出すユーザーの権限でコマンドを実行します(ユーザーとなりすましの代わりに?)。 –

関連する問題