【问题标题】:SSO on Microsoft Edge not working but does work on IE11, Chrome, Safari, Firefox - via Office.js add-inMicrosoft Edge 上的 SSO 不工作,但在 IE11、Chrome、Safari、Firefox 上工作 - 通过 Office.js 插件
【发布时间】:2020-05-07 19:26:50
【问题描述】:

我的 Office.js 插件应用程序中的以下 oAuth2 SSO 代码在 IE11、Chrome、Safari 和 Firefox 中运行良好,但在 Microsoft Edge 中无法运行。我可以看到不记名令牌正在通过 url 返回到弹出对话框:

https://localhost:3000/login?access_token=ya29.ImG6By-0ZWPQB4MsYxxxxxxxxxxxxxxxxxxxxxxxxxxxxE5XsM9v7SBi-OaUBBQucO05luKVP0pYoSrcYzbaUKAAX&token_type=Bearer

我还可以看到 asyncResult.status == 成功,即

[对象对象]:{状态:“成功”,值:对象} 状态:“成功”

值:对象

addEventHandler: function (){var d=OSF.DDA.SyncMethodCalls[OSF.DDA.SyncMethodNames.AddMessageHandler.id],c=d.verifyAndExtractCall(arguments,a,b),e=c[Microsoft.Office. WebExtension.Parameters.EventType],f=c[Microsoft.Office.WebExtension.Parameters.Handler];return b.addEventHandlerAndFireQueuedEvent(e,f)} 参数:空 来电者:空 长度:0 名称:“价值”

原型:对象

proto: function() { [本机代码] }

关闭:function (){var c=OSF._OfficeAppFactory.getHostFacade()[OSF.DDA.DispIdHost.Methods.CloseDialog];c(arguments,g,b,a)}

sendMessage: function (){var c=OSF._OfficeAppFactory.getHostFacade()[OSF.DDA.DispIdHost.Methods.SendMessage];return c(arguments,b,a)}

原型:对象

原型:对象

但是,“console.log('hello');” Microsoft Edge 运行侧边栏/加载项时不会调用。

弹出对话框在 F12 调试控制台中显示:

HTTP403: FORBIDDEN - 服务器理解请求,但拒绝执行。 (XHR)POST - https://browser.pipe.aria.microsoft.com/Collector/3.0/?qsp=true&content-type=application%2Fbond-compact-binary&client-id=NO_AUTH&sdk-version=AWT-Web-JS-1.1.1&x-apikey=a387cfcf60114a43a7699f9fbb49289e-9bceb9fe-1c06-460f-96c5-6a0b247358bc-7238&client-time-epoch-millis=1579626709267&time-delta-to-apply-millis=961

有什么想法吗?

export function loginUsingOAuth() {
    try {
        const sealUrl = getFromStorage('seal_url', STORAGE_TYPE.LOCAL_STORAGE);
        const redirectUrl = `${window.location.protocol}//${window.location.host}/login`;

        let displayInIframe = false;
        let promptBeforeOpen = false;

        if (typeof sealUrl !== 'undefined' && sealUrl) {
            const oAuthUrl = `${sealUrl}/seal-ws/oauth2/login?redirect_uri=${redirectUrl}`;

            Office.context.ui.displayDialogAsync(
                oAuthUrl,
                {
                    height: 80,
                    width: 80,
                    displayInIframe,
                    promptBeforeOpen
                },
                asyncResult => {
                    console.log('asyncResult');
                    console.log(asyncResult);
                    addLog(LOG_TYPE.INFO, 'authentication.loginUsingOAuth', asyncResult);
                    if (asyncResult.status !== 'failed') {
                        const dialog = asyncResult.value;

                        dialog.addEventHandler(Office.EventType.DialogMessageReceived, args => {
                            console.log('hello');

也许这实际上是在 Edge 中执行时的路由问题? “/login”回调被路由到 AuthCallback.js 组件:


const Routes = () => (
    <BrowserRouter>
        <Switch>
            <Route exact path="/login" component={AuthCallback} />
            <Route path="/" component={BaseLayout} />
        </Switch>
    </BrowserRouter>
);

AuthCallback.js 组件的构造函数在短暂的停顿后调用 messageParent:

    constructor(props) {
        super(props);
        const paramsObj = queryString.parse(props.location.search);
        const paramsStr = JSON.stringify(paramsObj);
        setTimeout(() => {
            Office.context.ui.messageParent(paramsStr);
        }, 1200);
    }

我开始怀疑 Edge 是否在搞乱重定向。在下图中,您可以看到 IE 和 Edge 针对相同的登录操作返回不同的状态码:

【问题讨论】:

  • 不要发布文字截图。如果粘贴时没有正确缩进,只需复制粘贴文本并正确缩进即可。此外,您的代码看起来还没有完成,但最重要的是:您在 Edge 中看到了哪些错误或警告,控制台日志记录设置为不过滤任何内容?
  • 据我了解,您的对话框正在调用 messageParent,而这在 Edge 上失败。您能否澄清一下您所看到的触发 403 的事件是什么?
  • HTTP 403 Forbidden client 错误状态响应码表示服务器理解请求但拒绝授权。此状态类似于 401,但在这种情况下,重新认证不会有任何区别。访问被永久禁止并与应用程序逻辑相关联,例如对资源的权限不足。尝试降低 Internet 选项中的安全设置,然后再次尝试检查问题。让我们知道您使用哪个版本的 Edge 进行此测试?参考:developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
  • 代码正在调用后端服务器,后端服务器又执行 SSO 登录。弹出对话框正在打开,其中包含启动该过程的身份验证 URL。此身份验证 url 包含一个回调 url,在此示例中为 localhost:3000/login。后端服务器执行身份验证并调用此指定的回调 url 以及访问令牌作为参数,例如localhost:3000?access_token=ya29.ImG6Bxxxx-etc-xxxx&token_t…
  • 为了进一步简化用例,问题可以总结如下:Microsoft Edge 执行代码时未触发以下事件 dialog.addEventHandler(Office.EventType.DialogMessageReceived, args => 也许Edge 正在限制事件,因为弹出对话框已重定向到回调 url ? idk

标签: single-sign-on office-js microsoft-edge


【解决方案1】:

Edge 浏览器似乎有两个问题。

  1. 在 Microsoft Edge 上运行时,当 displayInIframe=false 时,重定向/回调不会调用组件构造函数。所有其他浏览器都按预期工作。我添加了条件逻辑来为 Edge 浏览器用例设置 displayInIframe=true

  2. 当 displayInIframe=true 时,messageParent 方法也不适用于 Edge 浏览器。因此,我不得不在弹出对话框回调中提取身份验证令牌并将其存放在 local_storage 中。然后父级(侧边栏)轮询 local_storage 以检测登录是否已完成。同样,Chrome、Firefox、Safari、IE11(Mac 和 PC)都很好——只是 Edge 浏览器出了问题。

虽然这是一个丑陋的问题解决方案,但它也不完美,因为如果最终用户尚未登录 SSO,则会显示 Google [Account Selector] 对话框,当 displayInIframe=true 为这会引发 iframe 异常。

我没有看到任何其他选项对我们开放,因为操作系统内部版本号和 MSWord 版本决定了使用哪个浏览器来呈现侧边栏。如果 Edge 没有这些功能缺陷,那么无法选择是使用 IE11 还是使用 Edge 是可以忍受的。

【讨论】:

猜你喜欢
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 2018-06-14
相关资源
最近更新 更多