如何获取与Dialog流链接的Google帐户的用户名/ ID

Aru*_*run 3 actions-on-google dialogflow-es

我已将google助手与我的dialogflow代理集成.我需要获取调用intent的用户.

例如,如果用户帐户"ABC"有权通过Google助手应用程序调用我的代理,则在欢迎意图中我必须发送"欢迎ABC"之类的回复.如何通过谷歌助手应用实现这一点是我的终点.

提前致谢.

Pri*_*ner 7

这里有两个问题:如何获取用户的姓名以及如何获取他们的ID.

首先要意识到的是,此信息被视为个人身份信息(PII),因此未经用户许可,Google不会将此信息提供给您.您如何要求获得该许可,以及如何将其提供给您,取决于您的一些确切需求.

用户身份

从历史上看,您可以获取助理帐户的匿名用户ID.这与下面提供的Google用户ID不同,并且是一个持久性标识符,因此您可以跟踪返回的用户.

这已被弃用,如果这就是您所需要的,那么您可以创建自己的标识符并将其保存为userStorage的一部分.

请求用户信息

获取其名称的传统方式是请求用户访问其信息的权限.如果您使用的是动作谷歌库,则可以使用以下内容Permission对象执行此操作:

  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));
Run Code Online (Sandbox Code Playgroud)

如果用户授予权限,则结果将在conv.user.name.您应该将此保存在userStorage中,因为权限不是持久的.所以这可能看起来像:

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 );
Run Code Online (Sandbox Code Playgroud)

使用多重库,您可以指示User/Name环境属性是Requirements您想要的操作或意图之一.所以这可能在你的配置中

Local: {
  en: {
    Requirements: {
      "Action.multivocal.welcome": "User/Name"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

该名称将在以下环境中提供User/Name.

如果您使用的是JSON,则需要使用用户信息帮助程序.对于Dialogflow,这将属于payload.google.systemIntent属性,而对于Actions SDK,这将属于expectedInputs[0].possibleIntents[0].您可以指定以下内容:

    {
      "intent": "actions.intent.PERMISSION",
      "inputValueData": {
        "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
        "optContext": "To address you by name",
        "permissions": [
          "NAME"
        ]
      }
    }
Run Code Online (Sandbox Code Playgroud)

originalDetectIntentRequest.payload.user.profile如果您使用Dialogflow和user.profileAction SDK ,名称将在该字段下.

所有这一切似乎都很多,只是为了得到一个名字.如果你想要的话,你也无法获得电子邮件地址.但还有其他选择.

请求他们的Google个人资料

他们的Google个人资料包含他们唯一的Google ID,他们的全名(在"名称"字段中,given_name,last_name,以及一些其他信息,例如他们的电子邮件地址(电子邮件地址无法保证,因为他们可以从他们的您可以使用Google登录助理来请求此信息.操作控制台中需要一些配置,然后您将请求使用登录帮助程序获取它的权限.

使用动作在谷歌库,该行将是这样的:

conv.ask(new SignIn());
Run Code Online (Sandbox Code Playgroud)

一旦用户授予它,您就可以获得他们的个人资料

conv.user.profile.payload
Run Code Online (Sandbox Code Playgroud)

他们的名字在

conv.user.profile.payload.name
Run Code Online (Sandbox Code Playgroud)

和他们的电子邮件,你猜对了,

conv.user.profile.payload.email
Run Code Online (Sandbox Code Playgroud)

请注意,与要求提供用户信息不同,该配置文件将在以后的所有活动中提供.您不需要存储它.

使用multiocal,您可以说User/IsAuthenticated环境设置是Requirements您想要的操作或意图之一.所以这可能在你的配置中

Local: {
  en: {
    Requirements: {
      "Action.multivocal.welcome": "User/IsAuthenticated"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

该配置文件将在以下环境中可用User/Profile,名称将在User/Profile/name,以及电子邮件中User/Profile/email.

如果您使用的是JSON,则需要使用登录帮助程序.对于Dialogflow,这将属于payload.google.systemIntent属性,而对于Actions SDK,这将属于expectedInputs[0].possibleIntents[0].您可以指定以下内容:

    {
      "intent": "actions.intent.SIGN_IN",
      "inputValueData": {}
    }
Run Code Online (Sandbox Code Playgroud)

originalDetectIntentRequest.payload.user.idToken如果您使用Dialogflow和user.idTokenAction SDK,您将在该字段中获得该用户的身份令牌.您需要验证并解码此JWT.(google和multiocal动作库为您处理此步骤.)