OneDrive APIを使用してファイルをアップロードしようとしています。認証は期待通りに機能します。認証にはfiles.readwrite.all
とoffline_access
のスコープが使用されます。ユーザーのファイルを取得するなどのその他の呼び出しも期待どおりに機能します。ファイルをアップロードしようとすると、401の不正なエラーが発生します。OneDriveファイルのアップロードが予期せず401
最初に私がアップロードセッションを作成し、以下のコードを使用して、アップロードURLを取得:
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri("https://graph.microsoft.com");
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.ToString());
HttpResponseMessage response;
response = await client.PostAsync("/v1.0/drive/root:" + path + "/" + file.FileName + ":/createUploadSession", null);
string uploadUrl = (string)JObject.Parse(await response.Content.ReadAsStringAsync())["uploadUrl"];
}
予想通り、この作品。応答ステータスコードは200で、アップロードURLを取得します。次に、アップロードURLを使用してファイルをアップロードします。コンテンツには、アップロードしたい最初のチャンクのバイトが含まれています。 Content-LengthとContent-Rangeも正しく設定されています。 putリクエストを使用してアップロードURLに同じクライアントを使用してコンテンツを送信しています。
ByteArrayContent content = new ByteArrayContent(chunk);
content.Headers.Add("Content-Length", (contentRangeEnd - contentRangeBegin).ToString());
content.Headers.Add("Content-Range", "bytes " + contentRangeBegin + "-" + (contentRangeEnd - 1) + "/" + allBytes.Length);
response = await client.PutAsync(uploadUrl, content);
put要求の結果、401エラーが発生します。アクセストークンは、ファイルを期待どおりに取得するような他の呼び出しが行われるため有効であるようです。
401エラーを解決するにはどうすればよいですか?
これは正しいです。 [documentation](https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/item_createuploadsession#upload-bytes-to-the-upload-session)から:Including PUT呼び出しを発行するときにAuthorizationヘッダーがHTTP 401 Unauthoized応答を返す可能性があります。 Authoizationヘッダーとベアラートークンは、最初の手順でPOSTを発行するときにのみ送信する必要があります。 PUTを発行する際にはこれを含めないでください。 –