我想用Dialogflow和Google智能助理以及Google Transactions API创建一个聊天机器人,以便用户订购一些商品。现在我的代理包含以下四个意图:
Default Welcome Intent
(文字回复:你好,你想买一个巧克力盒吗?)Default Fallback Intent
Int3
(培训短语:"是的,我想登录",履行:启用webhook)Int4
(事件:actions_intent_SIGN_IN
,履行:已启用webhook)我使用Dialogflow Json而不是Node.js将我的代理与Transactions API连接起来。我实施了所有必要步骤,为Account Linking
Actions on Google
Auth0
设置Int3
,如以下帖子所述:
https://productforums.google.com/forum/#!topic/dialogflow/omr_2iZXLxw;context-place=forum/dialogflow
https://www.jovo.tech/blog/google-action-account-linking-auth0/
因此,现在我在对话过程中询问用户在手机上使用Google智能助理"您要登录吗?"然后用户回复"是的,我想登录"触发{
"payload": {
"google": {
"expectUserResponse": true,
"isSsml": false,
"noInputPrompts": [],
"systemIntent": {
"data": {
"@type": "type.googleapis.com/google.actions.v2.SignInValueSpec",
"optContext": "To make the order easier"
},
"intent": "actions.intent.SIGN_IN"
}
}
}
}
。在这种情况下,从我的后端通过webhook我发送以下json:
LOG IN WITH GOOGLE
然后,这会使以下窗口显示在用户的屏幕上:Log in window
所以我按Sorry, something went wrong. Please try again later
并选择我的一个Gmail帐户继续进行。但是,我在Google智能助理上收到以下错误:{
"responseId": "c65ab8d3-f6e9-4e86-9645-6785b01d3f10",
"queryResult": {
"queryText": "actions_intent_SIGN_IN",
"action": "sign_in",
"parameters": {},
"allRequiredParamsPresent": true,
"fulfillmentMessages": [
{
"text": {
"text": [
""
]
}
}
],
"outputContexts": [
{
"name": "projects/*********/agent/sessions/1527240031183/contexts/actions_capability_screen_output"
},
{
"name": "projects/*********/agent/sessions/1527240031183/contexts/actions_intent_sign_in",
"parameters": {
"SIGN_IN": {
"@type": "type.googleapis.com/google.actions.v2.SignInValue",
"status": "ERROR"
}
}
},
{
"name": "projects/*********/agent/sessions/1527240031183/contexts/actions_capability_audio_output"
},
{
"name": "projects/*********/agent/sessions/1527240031183/contexts/actions_capability_web_browser"
},
{
"name": "projects/*********/agent/sessions/1527240031183/contexts/actions_capability_media_response_audio"
}
],
"intent": {
"name": "projects/*********/agent/intents/75e0bc57-1829-4efe-9e35-dbcaa3da5a77",
"displayName": "Sign_in"
},
"intentDetectionConfidence": 1,
"diagnosticInfo": {},
"languageCode": "en-gb"
},
"originalDetectIntentRequest": {
"source": "google",
"version": "2",
"payload": {
"isInSandbox": true,
"surface": {
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.MEDIA_RESPONSE_AUDIO"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
},
"inputs": [
{
"rawInputs": [
{}
],
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.SignInValue",
"status": "ERROR"
},
"name": "SIGN_IN"
}
],
"intent": "actions.intent.SIGN_IN"
}
],
"user": {
"lastSeen": "2018-05-25T09:20:16Z",
"locale": "en-GB",
"userId": "*********"
},
"conversation": {
"conversationId": "1527240031183",
"type": "ACTIVE",
"conversationToken": "[]"
},
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
}
]
}
},
"session": "projects/*********/agent/sessions/1527240031183"
}
并且我在后端获得了以下json作为回复:
"status": "ERROR"
返回SignInValue
的{{1}}。
在Auth0
logs部分,此登录尝试被描述为成功但交换被描述为失败:
此特定失败交换的特定日志包含以下json:
{
"date": "2018-05-25T09:20:53.786Z",
"type": "feacft",
"description": "Unauthorized",
"connection_id": "",
"client_id": "Xsr3VFE***********",
"client_name": null,
"ip": "66.249.81.44",
"user_agent": "OpenAuth",
"hostname": "*********.eu.auth0.com",
"user_id": "",
"user_name": "",
"log_id": "****************"
}
其中feacft
代表Failed to exchange authorization code for Access Token
的{{1}}。
虽然可能无关紧要,但请注意:
Auth0
- > Auth0
- > Connections
- > Social
- > Google
TRY
:"This is not verified" Go to auth0.com (unsafe)
我终于得到了这个:"It works!"
在allow auth0.com to access my Google Account
日志部分,我终于得到了Auth0
。
此特定成功交换的特定日志包含以下json:
Success Exchange
但请注意,在后一种情况下({
"date": "2018-05-29T08:14:48.843Z",
"type": "seacft",
"description": "",
"connection_id": "",
"client_id": "EXOtUb****************",
"client_name": "N/A",
"ip": "35.160.3.103",
"user_agent": "Node-oauth",
"hostname": "**********.eu.auth0.com",
"user_id": "",
"user_name": "",
"log_id": "*****************"
}
),Success Exchange
与前一种情况(client_id
)不同。在Failed Exchange
案例中,Failed Exchange
是我创建的client_id
应用程序之一,但在Auth0
我不知道这是Success Exchange
的内容。也许它是内部安装client_id
的{{1}},用于测试client_id
与其他客户(Google,Facebook等)之间的连接。
如何通过Google智能助理成功登录并获取Auth0
的{{1}}?
到目前为止我做错了什么?
我发现有两条帖子报告了我遇到的错误Auth0
("status": "OK"
错误):
- https://github.com/auth0/react-native-auth0/issues/62
他们都报告说他们将SignInValue
个应用更改为Auth0
(例如来自feacft
)并且错误已修复。但是,我测试了这个,到目前为止它对我不起作用。
答案 0 :(得分:2)
"失败的交易所"日志及其详细日志条目似乎表明问题出在Google尝试将Auth Code替换为访问/刷新令牌时。 (我意识到这实际上是什么" feacft"意思是,我只是重复它。)Google和Auth0似乎都意识到这是失败的。
调试的第一步是确保客户端ID 和 Client Secret 在两个服务之间设置完全相同。这些将由Auth0服务器决定。
Action Console中“帐户关联”页面上的某些配置最近也发生了变化,您链接到的文档可能还没有反映出来。确保您已选择"不,我只想在我的网站上创建帐户"用于创建帐户和" OAuth" (不" OAuth& Google登录")和"授权代码"用于链接类型。
您可能还希望validate the server反对Google的OAuth实施,但这似乎不太可能,因为您使用的是Auth0。
答案 1 :(得分:2)
最后我解决了这个问题,尽管我并不完全知道为什么这个问题已得到解决,所以对我的回答有任何额外的解释是值得欢迎的。请写下面的评论。
在Auth0
Applications
小组现在看起来像这样:
到目前为止,我使用Auth0 Management API (Test Application)
应用程序及其在Google上的操作上的凭据来执行上述帖子中描述的任务。
我正在尝试修改此应用程序的一些设置和配置细节,但我仍然遇到了同样的错误。
然后,我想到了创建一个新的应用程序。我的新应用程序(New
,New2
)在手机上的Google智能助理上运行良好。
请记住,Auth0 Management API (Test Application)
和New2
应用程序之间的所有配置详细信息和设置都是相同的,因此我不知道为什么后者适用于虽然前者没有。我怀疑前者是一个测试应用程序,因此使用非常有限,但我认为它适用于我的项目。