无法交换访问令牌的授权代码 (feacft)

Failed to exchange authorization code for Access Token (feacft)

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

我正在使用 Dialogflow Json 而不是 Node.js 将我的代理与事务连接 API。我实施了所有必需的步骤,以使用 Auth0Actions on Google 设置 Account Linking,如以下帖子中所述:

因此,现在我在手机 phone Google Assistant 通话期间 "Do you want to sign in?" 询问用户 ,然后是用户 "Do you want to sign in?"响应 "Yes, I want to sign in" 触发 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"
            }
        }
    }
}

然后这使得以下 window 出现在用户的屏幕上:Log in window

所以我按 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"
} 

其中 returns "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": "****************"
}

其中 feacft 代表 Failed to exchange authorization code for Access TokenAuth0

尽管可能无关紧要,但请注意,当:

  1. 我手动去 Auth0 -> Connections -> Social -> Google -> TRY
  2. 我选择与上面相同的 Gmail 帐户
  3. 我在这个页面按Go to auth0.com (unsafe):"This is not verified"
  4. allow auth0.com to access my Google Account

我终于明白了:"It works!"

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;也许是内部安装的 Auth0client_id 用于测试 Auth0 和其他客户端(Google、Facebook 等)之间的连接。

如何通过Google助手成功登录并获得SignInValue"status": "OK"

到目前为止我做错了什么吗?

我发现有两个帖子报告了我在 Auth0 上遇到的错误(feacft 错误):

- 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(例如从 Machine to Machine)并且错误已修复。但是,我对此进行了测试,但到目前为止它对我不起作用。

"Failed Exchange" 日志及其详细的日志条目似乎表明问题出在 Google 试图用授权代码交换 Access/Refresh 令牌。 (我意识到这就是 "feacft" 的字面意思,我只是重复一遍。)Google 和 Auth0 似乎都意识到这是失败的。

调试的第一步是确保 Client IDClient Secret 在两者之间的设置完全相同服务。这些将由 Auth0 服务器决定。

Action Console 中帐户链接页面上的一些配置最近也发生了变化,您链接到的文档可能还没有反映出来。确保您已选择 "No, I only want to allow account creation on my website" 作为帐户创建和 "OAuth"( 而不是 "OAuth & Google Sign In")和 "Authorization code" 作为链接类型。

您可能还希望 validate the server 反对 Google 的 OAuth 实施,尽管这似乎不太可能,因为您使用的是 Auth0。

最后我解决了这个问题,尽管我并不真正确切地知道为什么这个问题是固定的,所以欢迎对我的回答进行任何额外的解释。请在下方留言。

Auth0 上,Applications 面板现在看起来像这样:

到目前为止,我正在使用 Auth0 Management API (Test Application) 应用程序及其在 Google 上的操作上的凭据来完成上面 post 中描述的任务。 我正在通过修改此应用程序的一些设置和配置细节进行试验,但我仍然遇到相同的错误。

然后,我想到了简单地创建一个新的应用程序。我的两个新应用程序(NewNew2)在 Google 手机 phone 上的智能助理上运行良好 phone。

请记住,在 Auth0 Management API (Test Application)New2 应用程序之间,所有配置细节和设置,据我所知,都是相同的,所以我不知道为什么后者为我工作而前者没有。我怀疑前者是一个测试应用程序,所以它的用途非常有限,但我认为它会为我的项目工作。