如何在 Google 上的 Actions 上仅使用 Google 帐户对用户进行身份验证?
How to authenticate user with just a Google account on Actions on Google?
目前 Google Assitant 包括一种简单的方法 和通过 OAuth2 在第三方服务上对用户进行身份验证的详细流程。如果我只需要让用户在 Google 本身上进行身份验证怎么办?我尝试使用 Google OAuth2 信息填写帐户 linking 流程,但这似乎不起作用。如果最后一件事应该能流畅地工作,那就足够了。
上下文:用户已经在相关网页上仅使用 Google 进行了身份验证。我只需要 link 这个已经通过身份验证的帐户与 Google 助理上未经过身份验证的帐户。
更新,2018 年 10 月 25 日:
自 2018 年 9 月 13 日起,如果您的项目使用 Google 登录,现在可以更简单地访问用户帐户。 Google Sign-In for Assistant 将在用户许可的情况下为您提供一个 ID 令牌,其中包含有关用户的信息,包括他们的 Google ID。仅使用语音即可授予此权限,并且相当精简。
如果您需要访问 Google 的 API,您可以 获得他们访问 OAuth 范围的权限。
更新,2017 年 10 月 25 日:
截至 10 月 4 日或 7 日左右,Google 已更新 their policy(再次)以恢复有效的语言限制 OAuth 端点。条款现在包括
When implementing account linking using OAuth, you must own your OAuth endpoint
而且(从下面的评论来看)他们现在检查 Google 端点以防止此方法起作用。
此时,您唯一能做的就是设置您自己的 OAuth2 服务器。
原Post:
广义上讲,您需要完成的身份验证任务分为四个部分:
- 配置您的项目(在云控制台中)以便启用日历 API 并正确配置 OAuth2 客户端。
- 在操作控制台中配置帐户链接操作。
- 为您的 API.AI 代理配置 Google 集成操作,以指示需要登录。
- 当 API.AI 调用您的 webhook 来实现 Intent 时,它将包含一个身份验证令牌作为 JSON 的一部分。您可以使用此令牌来调用您需要的 Google API。
配置云项目
您需要配置您的云项目,以便它可以访问您需要的 Google API,并设置 OAuth2 客户端 ID、机密和重定向 URI。
转到 https://console.cloud.google.com/apis/dashboard 并确保您拥有正在使用的项目 selected。然后确保您已启用所需的 APIs。
Select 左侧的 "Credentials" 菜单。你应该看到这样的东西:
Select "Create credentials" 然后 "OAuth client ID"
Select 这是给 "Web application" 的(有点……有点……)
输入一个名字。在下面的屏幕截图中,我使用了 "Action client" 所以我记得这实际上是针对 Google.
上的操作
在 "Authorized Redirect URIs" 部分,您需要包含一个形式为 https://oauth-redirect.googleusercontent.com/r/your-project-id
的 URI,用...您的项目 ID 替换 "your-project-id" 部分云控制台。此时,屏幕应如下所示:
单击 "Create" 按钮,您将看到一个包含您的客户端 ID 和密码的屏幕。您现在可以获得这些文件的副本,但也可以稍后再获得。
单击 "Ok",您将返回到添加了新客户端 ID 的 "Credentials" 屏幕。如果您需要再次获取 ID 和机密(或者如果机密已被泄露,则重置机密),您可以单击铅笔图标。
配置操作控制台
为项目设置 OAuth 后,我们需要告诉 Actions 我们将使用它来验证和授权用户。
转到 https://console.actions.google.com/ 和 select 您将使用的项目。
在概述中,完成任何必要的配置,直到您可以到达第 4 步,"Account Linking"。这可能需要您设置名称和图标 - 如果需要更正这些,您可以稍后返回。
- Select 授予类型 "Authorization Code" 然后单击下一步。
在“客户端信息”部分,输入您在 Cloud Console 中创建凭据时的客户端 ID 和客户端密码。 (如果您忘记了,请转到 Cloud Console API 凭据部分并单击铅笔。)
对于授权 URL,输入 https://accounts.google.com/o/oauth2/v2/auth
对于令牌URL,输入https://www.googleapis.com/oauth2/v4/token
点击下一步
- 您现在为您请求的范围配置您的客户端。与您输入范围的大多数其他地方不同 - 您需要每行一个。然后点击下一步。
- 您需要输入测试说明。在您提交您的操作之前,这些说明应包含一个测试帐户和密码,审核团队可以使用它来评估它。但是您可以在测试时将一些东西放在那里,然后点击“保存”按钮。
配置API.AI
在 API.AI 中,您需要指明用户需要登录才能使用该操作。
转到 https://console.api.ai/ 和 select 您正在处理的项目。
Select "Integrations" 然后 "Actions on Google"。如果你还没有打开它。
单击 "Sign in required for welcome intent" 复选框。
在您的 webhook 中处理事情
完成所有设置后,在您的 webhook 中处理事情就相当简单了!您可以通过以下两种方式之一获取 OAuth 访问令牌:
如果您正在使用 JavaScript 库,请调用 app.getUser().authToken
如果您正在查看 JSON 正文,它位于 originalRequest.data.user.accessToken
您将使用此访问令牌使用别处定义的方法对 Google 的 API 端点进行调用。
您不需要刷新令牌 - 除非用户已撤消访问权限,否则助理会向您提供有效的访问令牌。
联系Google后,目前的情况似乎是您应该设置自己的 OAuth2 服务器,然后在您的 OAuth2 服务器的登录屏幕上,您应该启动 Google OAuth2 流程。
you have to have your own endpoint with Google Oauth2 - it is correct that you can't use Google Oauth itself as a provider. To use the Google OAuth service, you can use a "sign in with Google" button in your own endpoint instead.
Source: Contacting Google Actions on Google Support
现在有点无语...因为这似乎是 Google 方面的巨大 疏忽。
无论您正在开发什么 Google 助理应用程序,您都需要实施 Oauth 协议。让我更清楚一点:
- 用户在小助手上,你需要link他给任何数据
你有你的应用程序端
- 对您拥有的数据的访问权限
您的用户受访问令牌保护
- Google 然后需要
要求您提供此令牌以访问此资源
- 当
google 拥有可以将其发送到应用程序的令牌,因此它会验证每个
请求获取资源。
这就是您需要实现自己的 oauth 服务器的原因(老实说,这只是您应用程序中的另外两个端点):在 google 端检查身份,但 link用户和要访问的资源之间的关系只能由您知道。
上面的过程是有效的,你只需要指定你自己的 token 端点和你自己的 auth 端点。
请注意,如果您只想检查用户是否已登录 google 并获取他的电子邮件,则只需实施不需要 /auth 端点的简化身份流程 (Automatically Sign Up Users with Streamlined Identity Flows)
蜜蜂说我实现了流程但得到了同样的错误:
expected_inputs[0].possible_intents[0]: Transactions/Identity API must be enabled before using.
很久以后我就能让它工作了。
我们必须先启用 webhook,我们可以在对话流程实现文档中看到如何启用 webhook
如果我们要使用 Google 助手,那么我们必须先在集成中启用 Google 助手集成。
然后按照下面提到的步骤在 google:-
上的操作中进行帐户链接
转到 google 云控制台 -> API 和服务 -> 凭据 -> OAuth 2.0 客户端 ID -> Web 客户端 -> 从那里记下客户端 ID、客户端密码
-> 下载 JSON - 来自 json 记下项目 ID,auth_uri,token_uri
-> 授权重定向 URIs -> 将我们应用程序的 URL 列入白名单 -> 在这个 URL 固定部分是 https://oauth-redirect.googleusercontent.com/r/ 并在 URL 中附加项目 ID
-> 保存更改
在 Google 上的操作 -> 帐户 link 设置
1.授权类型=授权码
2.客户信息
1. 填写client id,client secrtet, auth_uri, token_uri
2. 输入身份验证 uri 作为 https://www.googleapis.com/auth and token_uri as https://www.googleapis.com/token
3. 保存并 运行
4.在google助手上运行ning会报错,不用担心
5. 返回助手设置中的帐户 linking 部分并输入 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 and https://www.googleapis.com/auth/userinfo.email
我们很高兴去。
7. 保存更改。
在托管服务器日志中,我们可以看到访问令牌值,通过访问令牌,我们可以获得有关电子邮件地址的详细信息。
- 将访问令牌附加到此 link“https://www.googleapis.com/oauth2/v1/userinfo?access_token=”,我们可以在生成的 json 页面中获得所需的详细信息。
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"])
目前 Google Assitant 包括一种简单的方法
上下文:用户已经在相关网页上仅使用 Google 进行了身份验证。我只需要 link 这个已经通过身份验证的帐户与 Google 助理上未经过身份验证的帐户。
更新,2018 年 10 月 25 日:
自 2018 年 9 月 13 日起,如果您的项目使用 Google 登录,现在可以更简单地访问用户帐户。 Google Sign-In for Assistant 将在用户许可的情况下为您提供一个 ID 令牌,其中包含有关用户的信息,包括他们的 Google ID。仅使用语音即可授予此权限,并且相当精简。
如果您需要访问 Google 的 API,您可以
更新,2017 年 10 月 25 日:
截至 10 月 4 日或 7 日左右,Google 已更新 their policy(再次)以恢复有效的语言限制 OAuth 端点。条款现在包括
When implementing account linking using OAuth, you must own your OAuth endpoint
而且(从下面的评论来看)他们现在检查 Google 端点以防止此方法起作用。
此时,您唯一能做的就是设置您自己的 OAuth2 服务器。
原Post:
广义上讲,您需要完成的身份验证任务分为四个部分:
- 配置您的项目(在云控制台中)以便启用日历 API 并正确配置 OAuth2 客户端。
- 在操作控制台中配置帐户链接操作。
- 为您的 API.AI 代理配置 Google 集成操作,以指示需要登录。
- 当 API.AI 调用您的 webhook 来实现 Intent 时,它将包含一个身份验证令牌作为 JSON 的一部分。您可以使用此令牌来调用您需要的 Google API。
配置云项目
您需要配置您的云项目,以便它可以访问您需要的 Google API,并设置 OAuth2 客户端 ID、机密和重定向 URI。
转到 https://console.cloud.google.com/apis/dashboard 并确保您拥有正在使用的项目 selected。然后确保您已启用所需的 APIs。
Select 左侧的 "Credentials" 菜单。你应该看到这样的东西:
Select "Create credentials" 然后 "OAuth client ID"
Select 这是给 "Web application" 的(有点……有点……)
输入一个名字。在下面的屏幕截图中,我使用了 "Action client" 所以我记得这实际上是针对 Google.
上的操作
在 "Authorized Redirect URIs" 部分,您需要包含一个形式为
https://oauth-redirect.googleusercontent.com/r/your-project-id
的 URI,用...您的项目 ID 替换 "your-project-id" 部分云控制台。此时,屏幕应如下所示:单击 "Create" 按钮,您将看到一个包含您的客户端 ID 和密码的屏幕。您现在可以获得这些文件的副本,但也可以稍后再获得。
单击 "Ok",您将返回到添加了新客户端 ID 的 "Credentials" 屏幕。如果您需要再次获取 ID 和机密(或者如果机密已被泄露,则重置机密),您可以单击铅笔图标。
配置操作控制台
为项目设置 OAuth 后,我们需要告诉 Actions 我们将使用它来验证和授权用户。
转到 https://console.actions.google.com/ 和 select 您将使用的项目。
在概述中,完成任何必要的配置,直到您可以到达第 4 步,"Account Linking"。这可能需要您设置名称和图标 - 如果需要更正这些,您可以稍后返回。
- Select 授予类型 "Authorization Code" 然后单击下一步。
在“客户端信息”部分,输入您在 Cloud Console 中创建凭据时的客户端 ID 和客户端密码。 (如果您忘记了,请转到 Cloud Console API 凭据部分并单击铅笔。)
对于授权 URL,输入
https://accounts.google.com/o/oauth2/v2/auth
对于令牌URL,输入
https://www.googleapis.com/oauth2/v4/token
点击下一步
- 您现在为您请求的范围配置您的客户端。与您输入范围的大多数其他地方不同 - 您需要每行一个。然后点击下一步。
- 您需要输入测试说明。在您提交您的操作之前,这些说明应包含一个测试帐户和密码,审核团队可以使用它来评估它。但是您可以在测试时将一些东西放在那里,然后点击“保存”按钮。
配置API.AI
在 API.AI 中,您需要指明用户需要登录才能使用该操作。
转到 https://console.api.ai/ 和 select 您正在处理的项目。
Select "Integrations" 然后 "Actions on Google"。如果你还没有打开它。
单击 "Sign in required for welcome intent" 复选框。
在您的 webhook 中处理事情
完成所有设置后,在您的 webhook 中处理事情就相当简单了!您可以通过以下两种方式之一获取 OAuth 访问令牌:
如果您正在使用 JavaScript 库,请调用
app.getUser().authToken
如果您正在查看 JSON 正文,它位于
originalRequest.data.user.accessToken
您将使用此访问令牌使用别处定义的方法对 Google 的 API 端点进行调用。
您不需要刷新令牌 - 除非用户已撤消访问权限,否则助理会向您提供有效的访问令牌。
联系Google后,目前的情况似乎是您应该设置自己的 OAuth2 服务器,然后在您的 OAuth2 服务器的登录屏幕上,您应该启动 Google OAuth2 流程。
you have to have your own endpoint with Google Oauth2 - it is correct that you can't use Google Oauth itself as a provider. To use the Google OAuth service, you can use a "sign in with Google" button in your own endpoint instead.
Source: Contacting Google Actions on Google Support
现在有点无语...因为这似乎是 Google 方面的巨大 疏忽。
无论您正在开发什么 Google 助理应用程序,您都需要实施 Oauth 协议。让我更清楚一点:
- 用户在小助手上,你需要link他给任何数据 你有你的应用程序端
- 对您拥有的数据的访问权限 您的用户受访问令牌保护
- Google 然后需要 要求您提供此令牌以访问此资源
- 当 google 拥有可以将其发送到应用程序的令牌,因此它会验证每个 请求获取资源。
这就是您需要实现自己的 oauth 服务器的原因(老实说,这只是您应用程序中的另外两个端点):在 google 端检查身份,但 link用户和要访问的资源之间的关系只能由您知道。 上面的过程是有效的,你只需要指定你自己的 token 端点和你自己的 auth 端点。 请注意,如果您只想检查用户是否已登录 google 并获取他的电子邮件,则只需实施不需要 /auth 端点的简化身份流程 (Automatically Sign Up Users with Streamlined Identity Flows)
蜜蜂说我实现了流程但得到了同样的错误:
expected_inputs[0].possible_intents[0]: Transactions/Identity API must be enabled before using.
很久以后我就能让它工作了。 我们必须先启用 webhook,我们可以在对话流程实现文档中看到如何启用 webhook 如果我们要使用 Google 助手,那么我们必须先在集成中启用 Google 助手集成。 然后按照下面提到的步骤在 google:-
上的操作中进行帐户链接转到 google 云控制台 -> API 和服务 -> 凭据 -> OAuth 2.0 客户端 ID -> Web 客户端 -> 从那里记下客户端 ID、客户端密码 -> 下载 JSON - 来自 json 记下项目 ID,auth_uri,token_uri -> 授权重定向 URIs -> 将我们应用程序的 URL 列入白名单 -> 在这个 URL 固定部分是 https://oauth-redirect.googleusercontent.com/r/ 并在 URL 中附加项目 ID -> 保存更改
在 Google 上的操作 -> 帐户 link 设置 1.授权类型=授权码 2.客户信息 1. 填写client id,client secrtet, auth_uri, token_uri 2. 输入身份验证 uri 作为 https://www.googleapis.com/auth and token_uri as https://www.googleapis.com/token 3. 保存并 运行 4.在google助手上运行ning会报错,不用担心 5. 返回助手设置中的帐户 linking 部分并输入 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 and https://www.googleapis.com/auth/userinfo.email 我们很高兴去。 7. 保存更改。
在托管服务器日志中,我们可以看到访问令牌值,通过访问令牌,我们可以获得有关电子邮件地址的详细信息。
- 将访问令牌附加到此 link“https://www.googleapis.com/oauth2/v1/userinfo?access_token=”,我们可以在生成的 json 页面中获得所需的详细信息。
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"])