BIM 360 Viewer部分模型提示无权限,如何无需网页预打开直接访问?
问题描述
通过Autodesk Forge文档管理API将3D模型上传至BIM 360后,使用Viewer API加载模型时,部分模型会弹出权限错误提示:
No Access. Sorry. You don't have the required privileges to access this item. Please contact author
仅特定模型出现该问题,目前临时解决方法是先通过BIM 360网页端打开模型,之后Viewer API就能正常访问。需要实现无需网页预打开,直接从程序端加载模型的功能。
当前使用的Viewer初始化及加载代码如下:
var viewer; var options = { env: 'AutodeskProduction2', api: 'streamingV2', // for models uploaded to EMEA change this option to 'streamingV2_EU' getAccessToken: function(onTokenReady) { var token = [access token]; var timeInSeconds = 3600; // Use value provided by APS Authentication (OAuth) API onTokenReady(token, timeInSeconds); } }; Autodesk.Viewing.Initializer(options, function() { var htmlDiv = document.getElementById('forgeViewer'); viewer = new Autodesk.Viewing.GuiViewer3D(htmlDiv); var startedCode = viewer.start(); if (startedCode > 0) { console.error('Failed to create a Viewer: WebGL not supported.'); return; } console.log('Initialization complete, loading a model next...'); }); var htmlDiv = document.getElementById('forgeViewer'); viewer = new Autodesk.Viewing.GuiViewer3D(htmlDiv, {}); var documentId = [document urn]; Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure); function onDocumentLoadSuccess(viewerDocument) { // viewerDocument is an instance of Autodesk.Viewing.Document var defaultModel = viewerDocument.getRoot().getDefaultGeometry(); viewer.loadDocumentNode(viewerDocument, defaultModel); } function onDocumentLoadFailure() { console.error('Failed fetching Forge manifest'); }
原因分析
该问题源于模型上传后BIM 360未完成权限索引同步:直接通过API上传的模型,部分情况下BIM 360不会自动触发权限同步流程,导致Viewer请求时无法获取有效权限。而通过网页端打开模型时,BIM 360会触发后台同步,后续Viewer请求即可正常访问。
解决方案
1. 确保Access Token权限范围正确
生成Token时必须包含以下scope:
data:read:允许读取文档数据account:read:允许访问BIM 360项目账户信息bucket:read:允许读取存储桶资源
2. 加载模型前触发权限同步
在初始化Viewer后,先调用Forge Data Management API获取BIM 360文档详情,触发后台权限同步流程。
3. 修复Viewer重复实例化问题
原代码中两次创建GuiViewer3D实例会导致资源冲突,需合并初始化与加载逻辑。
修改后的代码
var viewer; var options = { env: 'AutodeskProduction2', api: 'streamingV2', getAccessToken: function(onTokenReady) { // 替换为你的有效Access Token var token = [access token]; var timeInSeconds = 3600; onTokenReady(token, timeInSeconds); } }; // 调用Data Management API触发BIM 360权限同步 function triggerBim360PermissionSync(projectId, itemId, token) { return fetch(`https://developer.api.autodesk.com/data/v1/projects/${projectId}/items/${itemId}`, { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }).then(response => response.json()); } // 初始化Viewer并加载模型 Autodesk.Viewing.Initializer(options, function() { var htmlDiv = document.getElementById('forgeViewer'); viewer = new Autodesk.Viewing.GuiViewer3D(htmlDiv); var startedCode = viewer.start(); if (startedCode > 0) { console.error('Failed to create a Viewer: WebGL not supported.'); return; } console.log('Initialization complete, syncing document permissions...'); // 替换为你的BIM 360项目ID、文档Item ID和Access Token var projectId = [your bim360 project id]; var itemId = [your document item id]; var token = [access token]; triggerBim360PermissionSync(projectId, itemId, token) .then(() => { var documentId = [document urn]; Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure); }) .catch(err => { console.error('Failed to sync permissions:', err); }); }); function onDocumentLoadSuccess(viewerDocument) { var defaultModel = viewerDocument.getRoot().getDefaultGeometry(); viewer.loadDocumentNode(viewerDocument, defaultModel); } function onDocumentLoadFailure() { console.error('Failed fetching Forge manifest'); }
内容的提问来源于stack exchange,提问作者iceybob3
相关产品推荐
相关产品推荐

