首页 > 解决方案 > 帐户关联成功后,Google 操作不提供 user.profile.payload 对象

问题描述

我按照本指南在我的应用程序中创建帐户链接 https://developers.google.com/actions/identity/google-sign-in#json

我能够验证用户的 jwt 解码器并发回用户被授权的响应。然后,根据指南,在下一个请求中,我应该获取用户的配置文件有效负载(json 结构中的 user.profile.payload),但下一个请求中缺少它。不仅如此,我再次获得了 jwt 验证的 tokenId。我认为我在这里想念的是 possibleIntent 对象,但我不确定,因为我没有看到任何文档,因为我使用 asp.net 服务器。有些 SDK 仅包含 java 和 nodeJS 的文档

这是为包含 tokenId 的登录提供的请求

{
  "user": {
    "locale": "en-US",
    "lastSeen": "2019-07-11T14:18:10Z",
    "idToken": "<tokenId>",
    "userVerificationStatus": "VERIFIED"
  },
  "conversation": {
    "conversationId": "ABwppHH9uZfcKj6pS6A6wItKC1dOXuZJ5oFYt2Og7cqrElSQYC9bv-aV7iQ5FDYaJPp-fa7tQNhc2yS0fw3QBu-M",
    "type": "ACTIVE",
    "conversationToken": "e0e78f40-a207-49c2-9050-50c6ed526c24"
  },
  "inputs": [
    {
      "intent": "actions.intent.SIGN_IN",
      "rawInputs": [
        {
          "inputType": "KEYBOARD"
        }
      ],
      "arguments": [
        {
          "name": "SIGN_IN",
          "extension": {
            "@type": "type.googleapis.com/google.actions.v2.SignInValue",
            "status": "OK"
          }
        },
        {
          "name": "text"
        }
      ]
    }
  ],
  "surface": {
    "capabilities": [
      {
        "name": "actions.capability.SCREEN_OUTPUT"
      },
      {
        "name": "actions.capability.ACCOUNT_LINKING"
      },
      {
        "name": "actions.capability.AUDIO_OUTPUT"
      },
      {
        "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
      },
      {
        "name": "actions.capability.WEB_BROWSER"
      }
    ]
  },
  "isInSandbox": true,
  "requestType": "SIMULATOR"
}

这是我在验证用户后提供的回复。我尝试了两种意图 act​​ions.intent.TEXT 和 actions.intent.SIGN_IN 但没有成功。下一个请求再次提供了 user.idToken 属性,而不是 user.profile(应该包含有效负载)

{
  "conversationToken": "b09d915e-6df9-496d-acde-b76858cd95b4",
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Hi",
                "displayText": "Hi"
              }
            }
          ],
          "suggestions": []
        }
      },
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.v2.SignInValue",
            "status": "OK"
          }
        }
      ]
    }
  ]
}

标签: c#actions-on-googlegoogle-account

解决方案


您正在谈论的user.profile属性是通过 JavaScript 的 actions-on-google 库提供的。它不在您将收到的 JSON 中。但...

您不需要它,因为基本个人资料信息(姓名、电子邮件和 Google ID)以user.idToken. 该字符串将针对每个请求发送给您,它只是一个您可以验证和解码的 JWT 令牌。该配置文件将位于“有效负载”部分。

我不知道 c#,但https://jwt.io/包含可以为您解码 JWT 字符串的库列表,以便您可以读取“有效负载”。

请记住,您不需要每次都验证令牌(尽管如果您做对了,这应该不会很昂贵),但是您可以对其进行解码以获得您正在寻找的信息。

如果你不想解码,你可以在第一次验证的时候解码,得到你需要的信息,然后把那个信息存储在userStorage字符串中(假设你不期望它改变)。


推荐阅读