C# 谷歌行动不';成功链接帐户后,不提供user.profile.payload对象

C# 谷歌行动不';成功链接帐户后,不提供user.profile.payload对象,c#,actions-on-google,google-account,C#,Actions On Google,Google Account,为了在我的应用程序中创建帐户链接,我遵循了此指南 我能够验证用户的jwt解码器,并返回用户已授权的响应。然后,根据指南,在下一个请求中,我应该获得用户的概要文件有效负载(json结构中的user.profile.payload),但在下一个请求中缺少它。除此之外,我还获得了用于jwt验证的令牌ID。 我想我在这里错过的是possibleIntent对象,但我不确定,因为我没有看到任何关于它的文档,因为我使用的是asp.net服务器。有些SDK仅包含java和NodeJ文档 这是为包含令牌ID的

为了在我的应用程序中创建帐户链接,我遵循了此指南

我能够验证用户的jwt解码器,并返回用户已授权的响应。然后,根据指南,在下一个请求中,我应该获得用户的概要文件有效负载(json结构中的user.profile.payload),但在下一个请求中缺少它。除此之外,我还获得了用于jwt验证的令牌ID。 我想我在这里错过的是possibleIntent对象,但我不确定,因为我没有看到任何关于它的文档,因为我使用的是asp.net服务器。有些SDK仅包含java和NodeJ文档

这是为包含令牌ID的中的登录提供的请求

{
  "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"
}

您所说的
user.profile
属性是通过google library for JavaScript上的操作提供的。您将收到的不是JSON。但是

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

我不知道c#,但包含一个库列表,可以为您解码JWT字符串,以便您可以读取“有效负载”

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


如果您不想对其进行解码,您可以在第一次验证时对其进行解码,获取所需信息,并将该信息存储在
userStorage
字符串中(假设您不希望更改)。

谢谢!我知道我每次都可以解码,但在每次会话请求中反复解码不是有点尴尬吗?令牌不应该只验证一次吗?我不认为这很“尴尬”,但我已经更新了我的答案以解决您的问题。好的,tnx。我认为google会在您发送令牌已验证的响应后,在每个请求中推送有效负载。事实上,解码并不“昂贵”,但似乎是多余的。假设令牌保持不变可能是不安全的如果您只需要用户ID,那么这是一个安全的假设。如果你用的是他们的名字,那就不是了。这取决于你的需要。请记住,令牌将发生变化,因为随着密钥的旋转,它将使用不同的密钥进行签名。但是有效负载内容应该很少改变。至于冗余的。。。每次发送idToken和配置文件信息不是多余的吗?{:
{
  "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"
          }
        }
      ]
    }
  ]
}