获取用户信息|谷歌助理|动作在谷歌上火力

时间:2018-03-05 07:59:32

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

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

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

以下是我的理解,请在任何我错的地方纠正我:

方法1

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

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

  3. 在互联网上的某个地方托管OAuth(ory-hydra)服务器。

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

  5. 方法2

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

    2. 使用firebase函数实现OAuth和令牌端点。 (我不知道如何做到这一点,如果可能的话)

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

    4. 如果我错了,请纠正我。

      更新:进行以下更改后:

      1. 将授权网址更改为:
      2.   

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

        1. 将授权类型更改为Implicit。
        2. 现在,我在调试部分获取了授权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中检查了我的意图所需的登录。

          enter image description here

          上一个问题 我正在尝试从我的Google助理会话机器人发送电子邮件。我可以使用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

2 个答案:

答案 0 :(得分:0)

这是正确的。出于安全和隐私目的,无法获取与用于设置智能助理帐户的帐户相关联的电子邮件地址。

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

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

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

为了清晰起见而更新:要明确 - 只需将您的帐户与其助理帐户相关联,您就不会自动向您提供有关其助理帐户的信息。您可以通过请求profile范围作为OAuth的一部分来获取他们的电子邮件地址(您的原始请求)。然后,当您知道他们通过智能助理与您联系时,您可以使用您收集的有关他们的信息。

在您更新的问题中,您在通过智能助理登录后尝试获取其姓名。如果您想要的只是他们的名字,您可以asked for permission获得此名称,而无需帐户链接或登录。 (或者,如上所述,您可能在他们创建帐户时要求这样做。)

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

您的更新有两件事。

  1. 出现提示"您的帐户似乎尚未关联"是正常的。您需要使用响应标签中提供的网址继续进行帐户关联。

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

  3. 根据您需要OAuth服务器的评论

    更新

    是的,您需要一台OAuth服务器。即使您只是希望用户登录自己的Google帐户,也不能只使用Google。

    有相当多的OAuth服务器可供使用,但谷歌搜索了#34;开源openid连接服务器"或者"开源oauth服务器"显示了一些有希望的结果。

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

    1. 为用户实施一种创建和登录服务
    2. 帐户的方式
    3. 实施Google描述的OAuth交换协议(我建议使用Auth Code Flow方法)。
    4. 您不需要自己的域名 - 您可以通过Firebase功能和Firebase托管实施这两项功能,其中包含项目主机名的SSL证书。

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

      首先,您需要使用Firebase托管和/或Firebase功能。它们只是一个为您提供有效HTTPS端点的选项。

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

      我不确定Firebase Hosting在您的示例中有什么意义。 auth交换端点和令牌交换端点正是OAuth2服务器所要做的。

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

      方法2 - 使用Firebase实施

      你完全正确。使用Firebase云功能和Firebase托管上托管的登录页面进行简单的OAuth2实施(使用Firebase身份验证进行登录)相当简单(不一定简单 - 但直截了当)。

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

答案 1 :(得分:0)

很长一段时间后我能够让它发挥作用。我们必须首先启用webhook,我们可以看到如何在对话框流程实现文档中启用webhook如果我们要使用Google智能助理,那么我们必须首先在集成中启用Google智能助理集成。然后按照下面提到的步骤进行谷歌操作中的帐户关联: -

转到Google云端控制台 - > API和服务 - >凭证 - > OAuth 2.0客户端ID - >网络客户端 - >请注意客户端ID,客户端密码 - >下载JSON - 从json记下项目id,auth_uri,token_uri - >授权重定向URI - >白名单我们的应用程序的URL - >在此网址中,已修复的部分为https://oauth-redirect.googleusercontent.com/r/,并将项目ID附加到网址中 - >保存更改

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.保存在谷歌助手上运行时会显示错误,但不要担心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"])`