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

时间:2018-06-15 15:24:58

标签: actions-on-google dialogflow

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

例如,如果用户帐户“ABC”有权通过Google助手应用程序调用我的代理,则欢迎意图我必须发送“欢迎ABC”等回复。如何通过Google助手应用实现这一目标是我的终点。

先谢谢。

2 个答案:

答案 0 :(得分:6)

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

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

用户ID

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

This has been deprecated,如果这就是您所需要的,那么您可以创建自己的标识符并将其保存为userStorage的一部分。

请求用户信息

获取其姓名的传统方式是向用户请求permission to access their information。如果您正在使用google上的操作库,则可以使用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));

如果用户授予权限,则结果将在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 );

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

Local: {
  en: {
    Requirements: {
      "Action.multivocal.welcome": "User/Name"
    }
  }
}

该名称将在User/Name下的环境中提供。

如果您正在使用JSON,则需要使用user information helper。对于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"
        ]
      }
    }

如果您使用Dialogflow并且originalDetectIntentRequest.payload.user.profile用于Action SDK,则名称将位于user.profile字段下。

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

申请其Google个人资料

他们的Google个人资料包含他们唯一的Google ID,他们的全名(在"名称"字段,given_name,last_name,以及一般其他一些信息,例如他们的电子邮件地址(电子邮件地址不是&#39) ; t保证,因为他们可以从他们的个人资料中省略这个,但通常在那里。)你可以使用Google Sign-In for the Assistant来请求这些信息。有一些configuration required in the Action console,然后你会请求获得使用它的权限sign-in helper

使用google上的操作库,该行将类似于:

conv.ask(new SignIn());

用户授予后,您可以在

中获取其个人资料
conv.user.profile.payload

他们的名字在

conv.user.profile.payload.name

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

conv.user.profile.payload.email

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

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

Local: {
  en: {
    Requirements: {
      "Action.multivocal.welcome": "User/IsAuthenticated"
    }
  }
}

该个人资料将在User/Profile下的环境中显示,名称将位于User/Profile/name中,电子邮件位于User/Profile/email中。

如果您正在使用JSON,则需要使用sign-in helper。对于Dialogflow,这将属于payload.google.systemIntent属性,而对于Actions SDK,这将属于expectedInputs[0].possibleIntents[0]。您可以指定以下内容:

    {
      "intent": "actions.intent.SIGN_IN",
      "inputValueData": {}
    }

如果您使用Dialogflow并且originalDetectIntentRequest.payload.user.idToken用于Action SDK,您将在user.idToken字段中获取该用户的身份令牌。你需要validate and decode这个JWT。 (google和multiocal动作库会为您处理此步骤。)

答案 1 :(得分:3)

最简单的方法是使用Google登录助理:https://developers.google.com/actions/identity/google-sign-in