botframework - Azure WebBot-Cortana OAUTH 问题“发布到 '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) 在 Request. (D:\home\site\wwwroot\node_modules\request\request.js:1161:10) 在emitOne (events.js:96:13) 在Request.emit (events.js:188:7) 在IncomingMessage。(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 Microsoft App Dev Luis 渠道:Web/Cortana/Skype OAuth
场景: 根据话语命中意图后,应用程序成功向用户显示“登录”卡片并要求用户登录
之后,用户能够使用使用 OAuth 进行身份验证的凭据成功登录以访问 Office 365
TestCase: Channel Skype: 成功显示和登录 Channel Web: 成功显示和登录 Channel Cortana: Fail (没有显示“签到”卡)
频道 Cortana:失败(不显示“登录”卡)现在我在 iphone 上使用 Cortana 应用程序,对于相同的 utterance-intent-action 这就是发生的情况
而控制台上出现的错误如上图
笔记:
在 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-App-Platform 中定义的回调。
但是 Cortana 确实说Cortana MSA 身份验证并且没有用
- 一方面,URL 映射到https://www.bing.com/agents/oauth,而不是在 web-app-bot-url/api/OAuthCallback 中定义的回调
- 鉴于他们指定的拱门,有人可以解释身份验证如何为 Cortana 工作
任何人都可以阐明我所知道的问题到底是什么,就理解而言,我遗漏了一些重要的东西。
谢谢
解决方案
谢谢你。
Cortana 的 OAuth 与 botframework 的工作方式不同。
从应用注册开始;如果您打开 Cortana 的“为您管理身份”,如果您打开“调用时登录”,Cortana 将发送登录卡。如果 Cortana 是频道,您的机器人永远不需要将登录卡作为附件发送。您在 Cortana 通道配置页面上注册 Microsoft AAD oauth 端点,然后您的应用注册具有指向https://www.bing.com/agents/oauth的重定向 url,以让 Cortana 知道身份验证令牌是什么。
接下来,使用 Cortana 的身份验证令牌,您将在登录后的活动(消息)上获取它。使用 botframework,它保存在密钥库中,因此您需要去获取它。
如果您没有启用“调用时登录”,则发送 oauth 卡作为附件,然后 Cortana 将启动 oauth 流程,但 Cortana 仅在呈现登录请求时使用标题。
注意应用注册;重定向 url 必须来自与 oauth 流的发起者相同的域。(对于 Cortana,这就是 bing。)
如果您不想使用 Cortana 的 OAuth,请关闭“Cortana 将管理我的身份”。使用登录卡并自己管理 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
让我知道这是否有帮助。
推荐阅读
- relational-database - DBMS 中的部分依赖
- javascript - 如何去反应的最后一个元素?
- linq - Linq 运算符聚合匹配值并对其加权
- python-3.x - 如何在 python 中导出加密密钥?
- python - 为什么在此代码中删除了最后一个按钮/任务?
- jenkins - 带有 ldap 的詹金斯:测试 LDAP 设置为用户显示两个组
- c# - Blazor wasm Web API 响应是一个 HTML 字符串
- python - 如何从脚本外部访问python变量
- python - 修改后的快速排序超出了最大递归深度
- javascript - Handlebars & Webpack:包含来自变量的模板