Azure WebBot-Cortana OAUTH Issue "POST to 'https://CortanaBFChannelWestUS.azurewebsites.net

Azure WebBot-Cortana OAUTH Issue "POST to 'https://CortanaBFChannelWestUS.azurewebsites.net

问题:

错误:POST 到“https://CortanaBFChannelWestUS.azurewebsites.net/v3/conversations/../activities/6TZfwIQ7Fqv”失败:[500] 内部服务器错误 在 Request._callback (D:\home\site\wwwroot\node_modules\botbuilder\lib\bots\ChatConnector.js:675:46) 在 Request.self.callback (D:\home\site\wwwroot\node_modules\request\request.js:185:22) 在 emitTwo (events.js:106:13) 在 Request.emit (events.js:191:7) 在请求。 (D:\home\site\wwwroot\node_modules\request\request.js:1161:10) 在 emitOne (events.js:96:13) 在 Request.emit (events.js:188:7) 在传入消息。 (D:\home\site\wwwroot\node_modules\request\request.js:1083:12) 在 IncomingMessage.g (events.js:291:16) 在 emitNone (events.js:91:20)

架构: Aure Web-Bot:NodeJS SDKv3 微软应用开发 路易斯 频道:Web/Cortana/Skype OAuth

场景: 根据话语点击意图后,应用程序会成功向用户显示 "sign-in" 卡片并要求用户登录

Screenshot of app sign-in

之后,用户能够使用使用 OAuth 进行身份验证的凭据成功登录以访问 Office 365

ScreenShot after login

测试用例: Channel Skype:成功显示并登录 Channel Web:成功显示并登录 Cortana 频道:失败(未显示 "sign-in" 卡片)

Channel Cortana:失败("sign-in"卡未显示) 现在我在 iphone 上使用 Cortana 应用程序,对于相同的话语意图操作,这就是发生的事情

Screen Shot Channel Cortana Invocation

控制台上显示的错误如上所示

备注:

在 Web-Bot 框架内当它是 Skype 或 Web 作为渠道时,OAuth 的回调映射到

server.get('/api/OAuthCallback',
    passport.authenticate('azuread-openidconnect', { failureRedirect: '/'}),
    (req, res) => {
    const address = JSON.parse(req.query.state);
    const messageData = { accessToken: req.user.accessToken, refreshToken: req.user.refreshToken, userId: address.user.id, name: req.user.displayName};
    var continueMsg = new builder.Message().address(address).text(JSON.stringify(messageData));
    bot.receive(continueMsg.toMessage());
    res.send('Welcome ' + req.user.displayName + '. Login successful. You can close this browser window')
});

实现 OAuth 的基本思想是 URl 映射到 Web 应用程序平台中定义的回调。

但 Cortana 确实说 Cortana MSA Authentication 但那没有用

  1. 其中 URL 映射到 https://www.bing.com/agents/oauth 而不是 web-app-bot-url/api/OAuthCallback
  2. 处定义的回调
  3. 有人可以解释 Cortana 的身份验证如何在他们指定的架构下工作

任何人都可以阐明我所知道的问题到底是什么,就理解而言,我遗漏了一些重要的东西。

谢谢

谢谢。

Cortana 的 OAuth 与 botframework 的工作方式不同。

从应用程序注册开始;如果您打开 Cortana 的 "manage identity for you",如果您打开 "sign in at invocation",Cortana 将发送登录卡。如果 Cortana 是频道,您的机器人永远不需要将登录卡作为附件发送。您在 Cortana 通道配置页面上注册 Microsoft AAD oauth 端点,然后您的应用程序注册将 url 重定向到 https://www.bing.com/agents/oauth 以让 Cortana 知道身份验证令牌是什么。

接下来,使用 Cortana 的身份验证令牌,您将在登录后在 activity(消息)上获取它。使用 botframework,它保存在密钥库中,因此您需要去获取它。

如果你没有"sign in at invocation",你发送一个oauth卡作为附件,然后Cortana将启动oauth流程,但Cortana在呈现登录请求时只使用标题。

注意app注册;重定向 url 必须来自与 oauth 流程的发起者相同的域。 (对于 Cortana,即 bing。)

如果您不想使用 Cortana 的 OAuth,请关闭 "Cortana will manage my identity"。使用登录卡并自行管理 oauth。但是,不要忘记您也需要管理刷新令牌(如果您使用 offline_access 范围,Cortana 将为您完成)。

您可以在此处找到有关 Cortana oauth 的更多信息; https://docs.microsoft.com/en-us/cortana/skills/authentication

我这里有一些关于差异的文档草稿; https://github.com/bw-kforce-ms/CortanaSkillsWIP/blob/master/Support/OAuth.md

如果有帮助请告诉我。

@Micromuncher,伙计,我终于掌握了一些基本的代码工作。我错过的是获取令牌的方式的简单性。之前使用护照获取授权码和其中涉及的复杂性,我认为最终过度设计了思维过程。

现在了解如何使此通道特定,以便仅针对 Cortana 使用 Cortana-flow,而其他一切使用 passport-openid 流。

谢谢!