我想在Google Home上开发一个应用程序(操作),它会向用户返回一些机密信息。因此,我无法根据帐户链接对用户进行身份验证,因为该设备可供会议室中的任何人使用。如何从语音匹配配置文件中获取用户的唯一身份(可能是电子邮件ID)?
答案 0 :(得分:4)
帐户关联与特定用户相关联,即#34; Ok Google"或者"嘿谷歌"调用你的Action。如果说出来的用户在他们使用的设备上没有注册的语音(他们是一个匿名的用户),那么他们就无法进行帐户链接。这听起来像是你所瞄准的安全级别,并且不清楚为什么你会这么想。
如果您正在使用node.js库,则可以使用app.getUser().userId
获取用户的唯一身份(使用或不使用帐户关联)。但是,如果用户是匿名的"在设备上(没有进行语音注册,或者它们与注册的语音不匹配),此身份将更改每个会话,因为无法确定用户是谁。
您无法获取用户的电子邮件ID。 (而且,即使你可以,也希望它遵循上述处理匿名用户的类似规则。)
更新以澄清我的意思是"匿名"请求:
当用户首次设置Google Home设备时,系统会提示他们在该设备上注册语音匹配。注册他们的声音需要他们说" Ok Google"和#34;嘿谷歌"这样可以建立一个语音模式。之后,此人说出的这些触发词将使其声明的其余部分与其Google智能助理帐户相关联。如果他们已对您的服务进行了帐户关联,则他们的Google智能助理帐户(与调用短语的语音相匹配)会与您的服务相关联。
可以允许其他用户注册设备的语音匹配。这会将调用短语的语音与其Google智能助理帐户相关联。如果该用户已经对您的服务进行了帐户链接,那么触发调用短语的语音将与其关联帐户相关联。
但是如果有人在没有为该设备设置语音匹配的情况下使用主页呢?调用短语仍然有效。他们仍然可以调用你的Action。但助理帐户与之相关联的是什么?
由于特定的家庭设备并不知道调用它并发出请求的人,因此这是一个匿名的"用户。匿名用户无法进行帐户关联,因为没有与该请求关联的助理帐户。虽然提供了一个userID - 这个ID会因为每个会话而改变,因为设备无法知道这次发出请求的匿名人员是上次发送请求的匿名人员。
但是如果用户设置了Home设备但是根本没有设置Voice Match,会发生什么?出于安全原因,系统必须假设这实际上是一个共享设备,并且所有请求都必须匿名处理。
其他更新
"匿名用户ID"上面谈到的内容已被弃用,将于2019年5月删除。
现在可以通过使用Google登录帐户关联来获取用户的电子邮件地址,前提是他们已将其注册为Google个人资料的一部分。
从概念上讲,答案的其他部分可能仍然有效,但有些细节可能已经改变。
答案 1 :(得分:0)
您可以使用帐户关联来实现此目的。如果您的手机处于锁定状态,那么只有声音的人才会在手机中注册,才能使用OK Google调用Google智能助理。 如果这种类型的调用适合您,那么请继续阅读帖子的其余部分。我已经发布了类似的答案here
我们必须首先启用webhook,我们可以在对话框流程实现文档中看到如何启用webhook 如果我们要使用Google智能助理,那么我们必须首先在集成中启用Google智能助理集成。 然后按照下面提到的步骤进行谷歌操作中的帐户关联: -
转到Google云端控制台 - > API和服务 - >凭证 - > OAuth 2.0客户端ID - >网络客户端 - >从那里注意客户端ID,客户端密钥 - >下载JSON - 从json记下项目id,auth_uri,token_uri - >授权重定向URI - >白名单我们的应用程序的URL - >在此URL中,固定部分为https://oauth-redirect.googleusercontent.com/r/,并将项目ID附加到URL中 - >保存更改
Google上的操作 - >帐户关联设置 1.授权类型=授权代码 2.客户信息 1.填写客户端ID,客户端secrtet,auth_uri,token_uri 2.输入auth uri为https://www.googleapis.com/auth,token_uri为https://www.googleapis.com/token 3.保存并运行 4.在谷歌助手上运行时会显示错误,但不要担心 5.返回助手设置中的帐户关联部分,输入auth_uri作为https://accounts.google.com/o/oauth2/auth 和token_uri为https://accounts.google.com/o/oauth2/token 6.将范围设为https://www.googleapis.com/auth/userinfo.profile和https://www.googleapis.com/auth/userinfo.email 我们很高兴。 7.保存更改。
在托管服务器日志中,我们可以看到访问令牌值,通过访问令牌,我们可以获取有关电子邮件地址的详细信息。
accessToken = req.get("originalRequest").get("data").get("user").get("accessToken")
r = requests.get(link)
print("Email Id= " + r.json()["email"])
print("Name= " + r.json()["name"])