【问题标题】:Get user information | google assistant | actions-on-google | Firebase获取用户信息 |谷歌助手 |谷歌行动 |火力基地
【发布时间】:2018-03-05 07:59:32
【问题描述】:

更新:拥有自己的 OAuth 服务器:

感谢您分享分步说明链接。另外,我没有 Firebase 托管。

以下是我的理解,如有错误请指正:

方法 1

  1. 我需要激活 Firebase 托管并构建 2 个端点。一个用于授权交换,另一个用于令牌交换。

  2. 我需要使用 OAuth 服务器。假设:ory-hydra 并使用我在 firebase 中创建的端点对其进行配置。或 AWS Lambda。

  3. 在 Internet 上的某处托管 OAuth (ory-hydra) 服务器。

  4. 在 google 上的操作中使用这些端点,并制作一个简单的网页,用户将被重定向到该网页进行身份验证。

方法 2

  1. 我需要激活 Firebase 托管并构建 2 个端点。一个用于授权交换,另一个用于令牌交换。

  2. 使用 firebase 函数来实现 OAuth 和令牌端点。 (我不知道该怎么做,如果可能的话)

  3. 在 google 上的操作中使用这些端点,并制作一个简单的网页,用户将被重定向到该网页进行身份验证。

如果我错了,请纠正我。

更新:进行以下更改后:

  1. 将授权 URL 更改为:

https://accounts.google.com/o/oauth2/v2/auth

  1. 将授权类型更改为隐式。

现在,我在调试部分获得了授权 URL,我可以通过将该 URL 粘贴到另一个选项卡中来进行授权。

但是,我在获取用户信息方面仍然遇到问题。我在 input.welcome 意图中有以下代码:

'input.welcome': () => {
  // Use the Actions on Google lib to respond to Google requests; for other requests use JSON
  if (requestSource === googleAssistantRequest) {
    sendGoogleResponse('Hello, Welcome to my First Fulfillment agent!'); // Send simple response to user
      app.askForSignIn();
      let displayName = app.getUserName().displayName;
      console.log(displayName)
  }  

我得到的只是调试日志中的 Null。

上一个问题 我正在尝试在 google 操作意图中获取用户信息。以下是我所做的:

1.) 从谷歌开发者控制台为我的项目创建了一个 OAUTH 密钥。 https://console.developers.google.com/apis/dashboard?project=.

2.) 登录到 console.actions.google.com 并点击帐户链接。

3.) 输入信息。请参阅屏幕截图以查看我输入的信息。

4.) 在我的“input.welcome”意图中添加了以下代码:

app.askForSignIn(); 

现在在模拟器中,我得到:“看起来您的我的测试应用帐户尚未关联。”我还从对话流 UI 中检查了我的意图所需的登录。

上一个问题 我正在尝试从我的谷歌助手对话机器人发送电子邮件。我可以使用 nodemailer 发送电子邮件。但是,我无法获取用户电子邮件地址。

以下是我发送电子邮件的代码:

var transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'My-Email',
        pass: 'My-Pass',
    }
});

var mailOptions = {
    from: 'Sender-Email',
    to: 'Receiver-Email',
    subject: 'Requested Information',
    text: 'Your information is here' 
};

function sendEmail(){
        transporter.sendMail(mailOptions, function(error, info){
            if (error) {
                console.log(error);
            } else {
                console.log('Email sent: ' + info.response);
            }
        });
}

最后,我在动作意图中调用它:

'input.sendmail': () => {
    sendEmail();
}, 

到目前为止,当有人说,向我的谷歌助理操作发送电子邮件时,我可以发送电子邮件。

在此之后,我尝试使用以下方法获取用户的电子邮件地址:

const app = new DialogflowApp({request: request, response: response});
console.log(app.getUserName())
console.log(app.getUser().userName)
console.log(app.getUser().userId)

但他们都没有给我用户的信息。相反,我在 dialogflow 控制台日志中得到以下信息:

{ 
userStorage: '{"data":{}}',
lastSeen: '2018-03-05T10:18:17Z',
locale: 'en-US',
userId: 'ABadfdfrffsdffNa0H4hlCy_eyZmVNa8LweMJMCyirUg-
qAx8FHwvSI49QurUhxhgLsT6IUU4nGfF1',
user_id: 'ABerysteui4hlCy_eyZmVNa8LweMJMCyirUg-
qAx8FHwvSI49QurUhxhgLsT6IUU4nGfF1',
access_token: undefined,
userName: null 
}

我试图用谷歌搜索这个问题,但我似乎需要关注 [1],但不确定。

如果有人能告诉我 [1] 是否是正确的指南,我将不胜感激,或者我需要其他东西?

谢谢!

[1]https://developers.google.com/actions/identity/account-linking

【问题讨论】:

    标签: node.js firebase oauth-2.0 actions-on-google dialogflow-es


    【解决方案1】:

    没错。出于安全和隐私目的,无法获取与用于设置 Google 助理帐户的帐户关联的电子邮件地址。

    解决此问题的正确方法是实施帐户关联。有了这个,您将在您的系统上创建一个帐户,并作为该帐户的一部分,获取用户的电子邮件地址(通常通过应用程序或 Web 应用程序)。然后,帐户链接会将您的帐户连接到 Google 助理的帐户,当他们使用该帐户访问您的操作时,您会收到一个访问令牌,您可以使用该令牌来识别这是您的哪个帐户。然后,您可以从您的帐户信息中获取用户的信息。

    当用户首次被提示关联其帐户时,Google Home 用户将在手机上的 Google Home 应用中获得一张活动卡片,该活动卡片会将他们引导至您的身份验证页面。在移动设备上,它应该直接在 Google 助理中打开。

    如果您还没有帐户或登录页面,您应该可以使用 Firebase Authentication 和 Google 身份验证提供程序来构建它。

    更新说明:需要明确的是 - 仅将您的帐户关联到他们的 Google 助理帐户不会自动为您提供有关他们的 Google 助理帐户的信息。当他们与您设置帐户时,您可以通过请求profile 范围作为 OAuth 的一部分来获取他们的电子邮件地址(您的原始请求)。然后,当您知道他们已通过 Google 助理与您联系时,您就可以使用您收集的有关他们的信息。

    在您更新的问题中,您尝试在他们通过 Google 助理登录后获取他们的姓名。如果您想要的只是他们的名字,您可以使用asked for permission 来获取此信息,而无需帐户链接或登录。 (或者,如上所述,您可以在他们为您创建帐户时提出此要求。)

    更新(基于您关于 OAuth 的问题)

    您的更新有两点。

    1. 提示“您的帐户似乎尚未关联”是正常现象。您需要使用响应选项卡中提供的 URL 来继续帐户关联。

    2. 然而,更重要的是,听起来您并没有设置 OAuth 服务器 - 只是您正在尝试进行配置。屏幕截图使您看起来好像只是在使用应该使用身份验证令牌进行响应的 URL,而不是系统将去请求它们的地方。请确保您已阅读https://developers.google.com/actions/identity/account-linking 的文档,以了解配置中应包含哪些值以及您需要执行哪些其他任务。

    更新根据您需要 OAuth 服务器的评论。

    是的,您需要一个 OAuth 服务器。即使您只想让您的用户登录他们的 Google 帐户,也不能只使用 Google 的。

    有相当多的 OAuth 服务器可用,但是谷歌搜索“开源 openid 连接服务器”或“开源 oauth 服务器”显示了一些有希望的结果。

    此外,Google 会为您提供step-by-step instructions 对它所连接的 OAuth 服务器的期望。所以你需要

    1. 实现一种方法让用户在您的服务上创建和登录帐户
    2. 按照 Google 的描述实现 OAuth 交换协议(我建议使用 Auth Code Flow 方法)。

    您不需要自己的域 - 您可以通过 Firebase Functions 和 Firebase Hosting 来实现这两者,其中包括用于项目主机名的 SSL 证书。

    更新解决您实现 OAuth2 服务器的可能方法。

    首先 - 你不需要需要使用 Firebase 托管和/或 Firebase 函数来做任何事情。它们只是为您提供有效 HTTPS 端点的一个选项。

    方法 1 - 使用外部包,例如 ory-hydra

    我不确定 Firebase 托管在您的示例中有何意义。身份验证交换端点和令牌交换端点正是 OAuth2 服务器要做的。

    我对 ory-hydra 了解不多,但它确实似乎是一个合理的解决方案。您需要将它托管在某个地方(AWS、Google Compute Engine 或其他可以使用它的托管服务提供商),但它应该提供您需要的端点。通过快速阅读 ora-hydra,您需要提供某种类型的帐户后端以及一种让您的用户登录该帐户的方式。

    方法 2 - 使用 Firebase 实现

    你说的完全正确。使用 Firebase Cloud Functions 和托管在 Firebase Hosting 上的登录页面(使用 Firebase 身份验证进行登录)进行简单的 OAuth2 实现是相当简单的(不一定容易 - 但简单)。

    您采用哪种方法取决于您。使用现有的解决方案肯定更容易,希望更可靠和安全,并且可以让您更专注于操作本身,但可能仍需要大量集成工作。实施 OAuth2 服务器可以让您更好地了解 OAuth2,但出现问题的风险更高。

    【讨论】:

    • 所以类似于“gcloud auth login”。执行此操作会打开一个新浏览器并要求登录。问题 - 我如何在我的系统上创建一个帐户?你的意思是,在欢迎意图中,我会将我的用户重定向到 gmail 登录页面?
    • 另外,用户在谷歌主页上使用我的操作是什么?在这种情况下,他们将无法访问重定向的网页。
    • 我已更新我的答案以解决您的其他问题。
    • 以下是我所做的: 1.) 从谷歌开发者控制台为我的项目创建了一个 OAUTH 密钥。 2.) 登录console.actions.google.com 并点击帐户链接。 3.) 输入信息。请参阅屏幕截图以查看我输入的信息。 4.) 在我的“input.welcome”意图中添加了以下代码:app.askForSignIn();现在在模拟器中,我得到:“看起来你的我的测试应用程序帐户尚未链接。”我还从对话流 UI 中检查了我的意图所需的登录。
    • 更新了答案。优秀的!一个了解 OAuth 和 OpenID Connect 服务器的机会!
    【解决方案2】:

    我可以在很长一段时间后让它工作。我们必须首先启用 webhook,我们可以在对话流实现文档中查看如何启用 webhook 如果我们要使用 Google Assistant,那么我们必须首先在集成中启用 Google Assistant Integration。然后按照下面提到的步骤在 google 上操作帐户链接:-

    转到谷歌云控制台 -> APIsand Services -> 凭证 -> OAuth 2.0 客户端 ID -> Web 客户端 -> 记下客户端 ID,客户端密码 -> 下载 JSON - 从 json 记下项目 ID,auth_uri , token_uri -> 授权重定向 URIs -> 白名单我们的应用程序的 URL -> 在这个 URL 的固定部分是 https://oauth-redirect.googleusercontent.com/r/ 并在 URL 中附加项目 id -> 保存更改

    Actions on Google -> 帐户关联设置 1. 授权类型 = 授权码 2. 客户端信息 1. 填写客户端 ID、客户端密码、auth_uri、token_uri 2. 输入 auth uri 为 https://www.googleapis.com/auth 和 token_uri 为 @987654323 @ 3. 保存运行 4. 在google助手上运行会报错,不过不用担心 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.profilehttps://www.googleapis.com/auth/userinfo.email 就可以了。 7. 保存更改。

    在托管服务器(heroku)日志中,我们可以看到访问令牌的值,通过访问令牌,我们可以获取有关电子邮件地址的详细信息。

    将访问令牌附加到此链接“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"])`
    

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 2020-10-20
      • 1970-01-01
      • 2020-10-25
      • 2019-01-09
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多