我们正在尝试在现有应用程序中嵌入能够访问 BIM 360 Team 数据的 Autodesk Forge Viewer。我们在 iframe 内执行 3-Leged 授权工作流程时遇到问题。我们使用 iframe 而不是弹出窗口 (
window.open()
) 或重定向当前窗口 (location.assign()
) 的理由如下:
将当前应用程序窗口重定向到授权会扰乱应用程序工作流程。应用程序启动授权不是一个选项。现有工作流程中的任何点都可能需要查看器,也可能根本不需要查看器,并且仅应在需要查看器之前触发授权。
在许多(桌面)浏览器中默认禁用在新窗口(弹出窗口)中打开授权。要求用户启用弹出窗口是一种选择,但绝对不方便用户。此外,移动环境中的多窗口浏览并不总是实现(例如在应用程序内浏览器中),这使得这不是一个选项。
iframe 中的授权将克服这些缺点,同时提供简单、不引人注目且一致的用户体验。
我们遵循此处和此处中所述的工作流程。登录页面(第二个链接 > 步骤 1 > 第一张图片)在 iframe 中显示良好,并且用户能够输入他/她的 Autodesk ID 凭据。之后,用户将被重定向到 OAuth 同意页面。同意页面(第二个链接 > 步骤 1 > 第二张图片)带有标题
X-Frame-Options: SAMEORIGIN
,在 iframe 中显然无法加载:Refused to display 'https://auth.autodesk.com/as/NH3Mc/resume/as/authorization.ping?opentoken=...' in a frame because it set 'X-Frame-Options' to 'deny'
。但是,如果用户事先同意(例如在单独的窗口中),则会跳过同意页面,并且用户会立即重定向到提供的回调 uri 以及所需的授权代码(响应代码 302 Found
,标头 Location: callback uri + code
)。
这就提出了一个问题:
X-Frame-Options: SAMEORIGIN
是否是有意设计的?在这种情况下,在 iframe 中禁用 OAuth 同意页面同时允许登录页面有什么好处?是否可以以某种方式禁用标头或为 Autodesk Forge App 中定义的原点添加异常作为回调 URL?
我们是否缺少任何其他选项来提供适用于桌面和移动平台的不显眼且一致的授权?
登录页面,尝试进行“重定向”。
重定向在 iframe 外部起作用,但在 iframe 内部不起作用。
解决方法是在父窗口中执行登录按钮,获取 3-legged 令牌,然后将该令牌传递给 iframe,嵌入式查看器将使用该令牌进行工作。