auth0 - 无法交换访问令牌的授权码 (feacft)
问题描述
我想使用 Dialogflow 和 Google Assistant 以及 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
- 如何在 Actions on Google 上仅使用 Google 帐户对用户进行身份验证?
https://productforums.google.com/forum/#!topic/dialogflow/omr_2iZXLxw;context-place=forum/dialogflow
https://www.jovo.tech/blog/google-action-account-linking-auth0/
因此,现在我在对话期间询问例如手机 Google Assistant 上的用户“您要登录吗?” 然后用户回复“是的,我想登录”,这会触发Int3
. 在这种情况下,我通过 webhook 从我的后端发送以下 json:
{
"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"
}
}
}
}
然后这使得以下窗口出现在用户的屏幕上:登录窗口
因此,我将继续按LOG IN WITH GOOGLE
并选择我的一个 gmail 帐户。但是,然后我在 Google 助理上收到以下错误:Sorry, something went wrong. Please try again later
而且我在后端收到以下json作为响应:
{
"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"
}
返回"status": "ERROR"
为SignInValue
.
在Auth0
日志部分,此登录尝试被描述为成功,但交换被描述为失败:
此特定失败交换的特定日志包含以下 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": "****************"
}
wherefeacft
代表Failed to exchange authorization code for Access Token
at Auth0
。
虽然它可能无关紧要,但让我注意到,当:
- 我手动转到
Auth0
->Connections
->Social
->Google
->TRY
- 我选择与上面相同的 Gmail 帐户
- 我
Go to auth0.com (unsafe)
在这个页面上按:“这未经验证” - 一世
allow auth0.com to access my Google Account
我终于明白了:“它有效!”
在Auth0
日志部分,我终于得到Success Exchange
了这个。
此特定成功交换的特定日志包含以下 json:
{
"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
;也许它是client_id
一个内部安装Auth0
的,用于测试Auth0
与其他客户端(谷歌、Facebook 等)之间的连接。
如何通过 Google Assistant 成功登录并"status": "OK"
获取SignInValue
?
到目前为止我做错了吗?
我发现两个帖子报告了我遇到的错误Auth0
(feacft
错误):
- https://github.com/auth0/react-native-auth0/issues/62
他们俩都报告说他们将Auth0
应用程序更改为Native
(例如 from Machine to Machine
)并且错误已修复。但是,我对此进行了测试,到目前为止它对我不起作用。
解决方案
“交换失败”日志及其详细日志条目似乎表明问题出在 Google 尝试将身份验证代码交换为访问/刷新令牌时。(我意识到这就是“feacft”的字面意思,我只是在重复一遍。)Google 和 Auth0 似乎都意识到这是失败的。
调试的第一步是确保两个服务之间的客户端 ID和客户端密码设置完全相同。这些将由 Auth0 服务器决定。
操作控制台中帐户链接页面上的一些配置最近也发生了变化,您链接到的文档可能尚未反映它们。确保您为帐户创建选择了“不,我只想允许在我的网站上创建帐户”,为链接类型选择“OAuth”(不是“OAuth 和 Google 登录”)和“授权码”。
您可能还希望根据 Google 的 OAuth 实现来验证服务器,尽管这似乎不太可能,因为您使用的是 Auth0。
推荐阅读
- angular - 在 Material Design 表行上使用 [ngClass]
- arrays - 嗨,我在设置动态数组的长度时不断遇到访问冲突
- java - org.apache.spark.sql.AnalysisException:没有这样的结构字段
- r - 如何有效地测试时间序列中的空间/时间自相关
- quickfixj - 支持 Java 7 的最后一个 quickfix 版本是哪个?
- reactjs - 如何从上一页获取模态窗口的背景位置,就像 Unsplash 一样?
- microsoft-graph-api - 如何使用 Microsoft Graph API 为团队设置电子邮件?
- ruby-on-rails - 如何使用 Active storage 和 jbuilder 而不是 1 个图像上传多个图像?
- javascript - 异步 Javascript 不访问类方法
- html - 下载的字体未显示在 html 文件中