首页 > 解决方案 > 无法交换访问令牌的授权码 (feacft)

问题描述

我想使用 Dialogflow 和 Google Assistant 以及 Google Transactions API 创建一个聊天机器人,以使用户能够订购一些物品。现在我的代理包含以下四个意图:

我正在使用 Dialogflow Json 而不是 Node.js 将我的代理与 Transactions API 连接起来。我实施了所有必要的设置步骤,Account Linking如以下帖子中所述Actions on GoogleAuth0

因此,现在我在对话期间询问例如手机 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 Tokenat Auth0

虽然它可能无关紧要,但让我注意到,当:

  1. 我手动转到Auth0-> Connections-> Social-> Google->TRY
  2. 我选择与上面相同的 Gmail 帐户
  3. Go to auth0.com (unsafe)在这个页面上按:“这未经验证”
  4. 一世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_idAuth0我创建的应用程序之一,但Success Exchange我不知道这是什么client_id;也许它是client_id一个内部安装Auth0的,用于测试Auth0与其他客户端(谷歌、Facebook 等)之间的连接。

如何通过 Google Assistant 成功登录并"status": "OK"获取SignInValue

到目前为止我做错了吗?

我发现两个帖子报告了我遇到的错误Auth0feacft错误):

- https://community.auth0.com/t/uwp-application-triggers-a-feacft-error-log-event-when-using-google-facebook-authentication/6394

- https://github.com/auth0/react-native-auth0/issues/62

他们俩都报告说他们将Auth0应用程序更改为Native(例如 from Machine to Machine)并且错误已修复。但是,我对此进行了测试,到目前为止它对我不起作用。

标签: auth0actions-on-googledialogflow-es

解决方案


“交换失败”日志及其详细日志条目似乎表明问题出在 Google 尝试将身份验证代码交换为访问/刷新令牌时。(我意识到这就是“feacft”的字面意思,我只是在重复一遍。)Google 和 Auth0 似乎都意识到这是失败的。

调试的第一步是确保两个服务之间的客户端 ID客户端密码设置完全相同。这些将由 Auth0 服务器决定。

操作控制台中帐户链接页面上的一些配置最近也发生了变化,您链接到的文档可能尚未反映它们。确保您为帐户创建选择了“不,我只想允许在我的网站上创建帐户”,为链接类型选择“OAuth”(不是“OAuth 和 Google 登录”)和“授权码”。

在此处输入图像描述

您可能还希望根据 Google 的 OAuth 实现来验证服务器,尽管这似乎不太可能,因为您使用的是 Auth0。


推荐阅读