You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何编程下载Autodesk ACC模型?遇403错误求排查

关于Autodesk ACC模型下载的权限与代码问题解答

1. 是否需要3-legged token?

是的,绝大多数场景下需要使用3-legged token。ACC(Autodesk Construction Cloud)的项目文件属于用户/团队私有资源,需通过用户授权的3-legged token验证访问权限。仅当访问完全公开的项目资源时,才可能使用2-legged token,但这种场景极少。

2. 403 Forbidden错误的可能原因及修复建议

结合你提供的代码,以下是几个关键问题点:

(1) 获取Item的请求未使用授权token

代码中调用client.GetAsync(url)获取item信息时,该client是否携带了有效的3-legged token?若此请求未授权,即便返回200状态码,拿到的storage链接也可能无效,导致后续下载权限不足。

修复:初始化client时,需像后续downloadClient一样添加3-legged token的Authorization头。

(2) storageHref可能是相对路径或无效链接

Autodesk Data API返回的includedVersion("relationships")("storage")("meta")("link")("href")有时为相对路径(如/oss/v2/...),直接使用会导致请求地址错误。

修复:为storageHref拼接完整的API域名前缀:

Dim storageHref As String = $"https://developer.api.autodesk.com{includedVersion("relationships")("storage")("meta")("link")("href").ToString}"

(3) 3-legged token的权限范围不足

获取3-legged token时,必须确保请求的scope包含data:readbucket:read,否则即便拿到token,也无权限读取项目数据和存储桶文件。

修复:调用GetAccessToken3Legged方法时,确认请求的scope参数包含这两个权限(如设置为"data:read bucket:read")。

(4) 更可靠的下载方式:通过Storage ID调用OSS API

若直接使用meta中的href仍有问题,可改用Storage ID构造下载请求:

  1. includedVersion("relationships")("storage")("data")("id")提取storage ID,格式为{bucketKey}/{objectName}
  2. 拆分出bucketKeyobjectName,构造下载URL:https://developer.api.autodesk.com/oss/v2/buckets/{bucketKey}/objects/{objectName}
  3. 用3-legged token请求该URL即可下载文件

修正后的关键代码片段示例

' 确保获取Item的client已携带3-legged token
client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", accessToken3L)
Dim modelResponse As HttpResponseMessage = Await client.GetAsync(url)

' 拼接完整的storageHref
Dim storageHref As String = $"https://developer.api.autodesk.com{includedVersion("relationships")("storage")("meta")("link")("href").ToString}"

' 或者用Storage ID构造下载链接
Dim storageId As String = includedVersion("relationships")("storage")("data")("id").ToString
Dim parts As String() = storageId.Split("/")
Dim bucketKey As String = parts(0)
Dim objectName As String = parts(1)
Dim downloadUrl As String = $"https://developer.api.autodesk.com/oss/v2/buckets/{bucketKey}/objects/{objectName}"

内容的提问来源于stack exchange,提问作者David

火山引擎 最新活动