Actions on google 如何获取与对话流链接的google帐户的用户名/id

Actions on google 如何获取与对话流链接的google帐户的用户名/id,actions-on-google,dialogflow-es,Actions On Google,Dialogflow Es,我已将google助手与我的dialogflow代理集成。我需要找到调用意图的用户 例如,如果用户帐户“ABC”有权通过谷歌助手应用程序调用我的代理,出于欢迎的目的,我必须发送一个类似“欢迎ABC”的响应。如何使用google assistant实现这一点?应用程序是我的端点 提前感谢。最简单的方法是使用谷歌登录助手:您这里有两个问题:如何获取用户名和用户名 首先要意识到的是,这些信息被视为个人识别信息(PII),因此谷歌不会在未经用户许可的情况下将其提供给您。您如何申请许可,以及如何向您提供许

我已将google助手与我的dialogflow代理集成。我需要找到调用意图的用户

例如,如果用户帐户“ABC”有权通过谷歌助手应用程序调用我的代理,出于欢迎的目的,我必须发送一个类似“欢迎ABC”的响应。如何使用google assistant实现这一点?应用程序是我的端点


提前感谢。

最简单的方法是使用谷歌登录助手:

您这里有两个问题:如何获取用户名和用户名

首先要意识到的是,这些信息被视为个人识别信息(PII),因此谷歌不会在未经用户许可的情况下将其提供给您。您如何申请许可,以及如何向您提供许可,取决于您的一些具体需求

用户ID

历史上,您可以获得助手帐户的匿名用户ID。这将不同于下面提供的Google用户ID,它是一个持久标识符,因此您可以跟踪返回的用户

,如果这是您所需要的全部,那么您可以创建自己的标识符并将其另存为

请求用户信息

获取其名称的传统方法是请求用户输入名称。如果您正在使用google library上的操作,则可以使用
权限
对象执行此操作,并使用类似以下内容:

  const options = {
    // We just want permission to get their name
    permissions: ['NAME'],

    // Prompt them why we want the information
    context: 'To address you by name'
  };
  conv.ask(new Permission(options));
    {
      "intent": "actions.intent.PERMISSION",
      "inputValueData": {
        "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
        "optContext": "To address you by name",
        "permissions": [
          "NAME"
        ]
      }
    }
    {
      "intent": "actions.intent.SIGN_IN",
      "inputValueData": {}
    }
如果用户授予权限,结果将显示在
conv.user.name
中。您应该将其保存在中,因为权限不是持久的。所以这可能看起来像:

var userStorageStr = conv.user.userStorage || '{}';
var userStorage = JSON.parse( userStorageStr );
var name = conv.user.name || userStorage.name;
userStorage.name = name;

// ...

conv.user.userStorage = JSON.stringify( userStorage );
conv.ask(new SignIn());
使用multivocal库,您可以指出
User/Name
环境属性是所需操作或意图的
要求之一。所以这可能在您的配置中

Local: {
  en: {
    Requirements: {
      "Action.multivocal.welcome": "User/Name"
    }
  }
}
Local: {
  en: {
    Requirements: {
      "Action.multivocal.welcome": "User/IsAuthenticated"
    }
  }
}
该名称将在环境中的
User/name
下可用

如果您使用的是JSON,那么您需要使用。对于,这将位于
payload.google.systemIntent
属性下,而对于Actions SDK,这将位于
expectedInputs[0].可能内容[0]
中。您可以指定如下内容:

  const options = {
    // We just want permission to get their name
    permissions: ['NAME'],

    // Prompt them why we want the information
    context: 'To address you by name'
  };
  conv.ask(new Permission(options));
    {
      "intent": "actions.intent.PERMISSION",
      "inputValueData": {
        "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
        "optContext": "To address you by name",
        "permissions": [
          "NAME"
        ]
      }
    }
    {
      "intent": "actions.intent.SIGN_IN",
      "inputValueData": {}
    }
如果您正在为Action SDK使用Dialogflow和
user.profile
,则名称将位于
OriginalDetectEntertRequest.payload.user.profile
字段下

所有这些似乎都是为了得到一个名字。另外,如果你想获得电子邮件地址,你也无法获得。但还有其他选择

请求他们的谷歌个人资料

他们的谷歌个人资料包含他们唯一的谷歌ID、全名(在“姓名”字段中,有给定的姓名、姓氏,通常还有一些其他信息,如他们的电子邮件地址(电子邮件地址不保证,因为他们可以从个人资料中省略此信息,但通常存在此信息)。您将使用来请求此信息。存在一些,然后您将使用请求权限来获取此信息

在google library上的操作中,这行代码将类似于:

var userStorageStr = conv.user.userStorage || '{}';
var userStorage = JSON.parse( userStorageStr );
var name = conv.user.name || userStorage.name;
userStorage.name = name;

// ...

conv.user.userStorage = JSON.stringify( userStorage );
conv.ask(new SignIn());
一旦用户授权,您就可以在中获取他们的配置文件

conv.user.profile.payload
他们的名字

conv.user.profile.payload.name
还有他们的电子邮件,你猜对了

conv.user.profile.payload.email
请注意,与询问用户信息不同,配置文件将在您未来的所有活动中提供。您不需要存储它

对于MultiVoice,您可以说
用户/IsAuthenticated
环境设置是所需操作或意图的
要求之一

Local: {
  en: {
    Requirements: {
      "Action.multivocal.welcome": "User/Name"
    }
  }
}
Local: {
  en: {
    Requirements: {
      "Action.multivocal.welcome": "User/IsAuthenticated"
    }
  }
}
配置文件将在
User/profile
下的环境中可用,名称将在
User/profile/name
中,电子邮件将在
User/profile/email

如果您使用的是JSON,那么您需要使用.For,它将位于
有效负载.google.systemIntent
属性下,而对于Actions SDK,它将位于
expectedInputs[0]。possibleIntents[0]
中。您可以指定如下内容:

  const options = {
    // We just want permission to get their name
    permissions: ['NAME'],

    // Prompt them why we want the information
    context: 'To address you by name'
  };
  conv.ask(new Permission(options));
    {
      "intent": "actions.intent.PERMISSION",
      "inputValueData": {
        "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
        "optContext": "To address you by name",
        "permissions": [
          "NAME"
        ]
      }
    }
    {
      "intent": "actions.intent.SIGN_IN",
      "inputValueData": {}
    }

如果您在Action SDK中使用Dialogflow和
user.idToken
,您将在
OriginalDetectEntertRequest.payload.user.idToken
字段中获得用户的身份令牌。您将需要使用此JWT。(google和multivocal库上的操作为您处理此步骤。)

谢谢。当我从API生成响应时,我能够获得名称以及权限。我还尝试使用原始请求获取电子邮件id。对于某些用户,我获取的是访问令牌,而不是其他配置文件。为什么某些用户缺少我?根据您的上述评论,我们可以从idToken获取电子邮件吗?如果是。h这怎么可能实现呢?我已经更新了我的答案,加入了有关电子邮件的信息。我不确定你的意思是“我正在获取访问令牌,而不是其他配置文件”