【发布时间】:2020-05-07 19:26:50
【问题描述】:
我的 Office.js 插件应用程序中的以下 oAuth2 SSO 代码在 IE11、Chrome、Safari 和 Firefox 中运行良好,但在 Microsoft Edge 中无法运行。我可以看到不记名令牌正在通过 url 返回到弹出对话框:
我还可以看到 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