首页 > 解决方案 > 将文件上传到 OneDrive 时出现 InvalidAuthenticationToken

问题描述

我正在尝试使用以下代码将文件上传到 OneDrive:

$graph_url = 'https://graph.microsoft.com/v1.0/me/drive/root:/filename:/createUploadSession';
$file = file_get_contents('logo.jpeg');
$headers = [
    'Content-Type: json',
    "Cache-Control: no-cache",
    "Pragma: no-cache",
    "Authorization: bearer EwAQA61DBAAUcSSzoTJJsy+XrnQXgAKO5cj4yc8AAewWnvfTuLAC2gDmYesGiVawqeIpfS8lJjyCyeXQMrKOu92FA0SK12N/87GBTs4ba2LJ5buqmm9gX18by0jPWzZ5qvpc+BdfMC2wUyiMYxh8QH8BJFBctAVgSaKM1KmhA8mAwb2czyw4OeWdupKH7qSPvjRtwBTTxxX8iIO3IeNbpXDghri9MWRGyVIffGf2Oi+RzQm5jbGuDtXrQa4K80m1o8PHcEkdIEXbaAgIE8oBYCVBQ7fyYxA84b0NjghSRbCZDj5rVbo1MDeBv0J4inmPthEbAMcS3fRSBdFs3+SSz+jZwb3SgSp5Q+VXiRs+keDQHspaoSNt4Ho0+pX94WQDZgAACAk/KNYU0yEY4AHihrs84QKvmWWfIOTYCBudQZD7tKp2ZeOpXEI7q3tOTuwHTv7uUmYxkpGswiNSeW2r9DEBdQ5gBtZ/YCXMPhlBLSxxahrl816zsj/UDi2c6dmB+6J1wk60/hm1Ll6vqn8YbtlyQh9hFLpWejo8+Vofh5/kRUfUSl1v7FIP7YIJLvTyNn1gGy9IMnxYdvba9ACGotVpFTAMNdjz6aQwUk4MJjD7csqYVpyMBh8O7bS40dRMjiUkdhXYvA03L/JV818qgo0W0uwJmoqzPJfe7VB+VekqxPCyVT6A86y/OaD1EsTaLwBILG8eS48Odr/qg7azjUsrdryS+rg7wfQEBEL+kIkS5Ne8eTg1/t2aAXFsUukiIBkTYp+Sold4yhqJU2w/cRDZiz9m3GBltjTS+JiIX2Ll0ABbOwmY9pkc6O8/3T0ZhgVuIigfIILTdMGMu9sNvJtVxYL4gbRlNX+gyMBHZHDo2zktdD5l4vDa+TTgn2Fc3CDUli/qLU1UX2SfJ6+B+epmX/wA32cXVtfDPcm605c18LipDoOVGxzf9RVyNe9e3VCFvR9UBmkobodVfE1VhUfzw/s5CHrjzCZ7ZZDt84Hm6VoWIVZLtYueHCuAaEhLa0gWZTKUSwvu3hCDwZUaAg==",
    "Content-Length: ".filesize('logo.jpeg'),
];

$ch = curl_init($graph_url);
curl_setopt($ch, CURLOPT_URL, $graph_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{}');
$server_output = curl_exec($ch);
$info = curl_getinfo($ch);

但是,结果始终是以下错误:

"error": {
    "code": "InvalidAuthenticationToken",
    "message": "CompactToken parsing failed with error code: 8004920A",
    "innerError": {
        "request-id": "bab6035c-17c5-45ea-99ac-7c809e446ca2",
        "date": "2018-12-22T09:42:03"
    }
}

标签: bashmicrosoft-graph-apionedrive

解决方案


首先,您的令牌似乎不正确。所以第 1 步是验证令牌是否正确。您可以通过复制您的令牌并将其粘贴到 Microsoft 专门为此工作创建的网站上来做到这一点。https://jwt.ms

其次,正如微软文档所描述的,您有两种将文件上传到 onedrive 的方法。

  1. 直接上传(仅适用于小文件) 文档
  2. 通过上传会话文档

您正在尝试直接上传到CreateUploadSession端点。第一种方法(对于小文件)通过将文件上传到/content端点来工作,但这只是一个文件上传。所以其中没有内容标题json

第二种方法通过创建一个上传会话(以一些 json 响应)然后执行第二个请求以将文件上传到您从 url 获得的端点。

关于这些东西的文档非常清楚,我认为您正在使用 PHP,因此使用 php 模仿提供的 curl 请求应该很容易。


推荐阅读