首页 > 解决方案 > Google 助理帐户关联 - 使用后端进行身份验证

问题描述

我是 Moodle 管理员,我想连接 Dialogflow 聊天机器人 – Google Assistant – Moodle 站点(Moodle 站点 = 后端服务器 = mysite)。当 Dialogflow 意图通过 webhook 从 Moodle 请求私人用户数据时,该意图需要登录,并且必须在服务器上识别用户。我想使用基于 OAuth 的 Google 登录链接概念。

实施的服务:

  1. Dialogflow 和 Moodle 通过 webhook 连接。Fulfillment – Webhook URL:mysite/client.php。client.php 文件位于 Moodle 服务器(后端服务器)上。意图使用 webhook,Moodle 以 JSON 格式发送答案。

  2. Google Oauth 2 客户端已创建。URI: mysite 授权重定向 URI mysite/callback.php(适用于 PHP 的 Google API 客户端库 - 需要登录) oauth-redirect.googleusercontent.com/r/DialogflowBotID(DialogflowBot 需要) mysite/moodle37/admin/oauth2callback.php(Moodle 需要)

  3. Google Oauth 2 和 Moodle 已连接 ( https://docs.moodle.org/39/en/OAuth_2_Google_service )。在 Moodle 中设置了 OAuth2 Google Cloud 服务,使用户能够使用 Google 帐户登录 Moodle。首先,在聊天之前,用户登录:Google 对用户进行身份验证,将用户数据发送到 Moodle,Moodle 将用户的 gmail 地址存储在 'mdl_auth_oauth2_linked_login' mysql 表中。在谷歌术语中:用户的信息存在于后端服务器中。

  4. Dialogflow 和 Google 助理通过帐户链接 (developers.google.com/assistant/identity/google-sign-in-oauth) 连接。链接类型:OAuth 和 Google 登录 – 隐式授权 URL:mysite/login.php 令牌 URL:oauth2.googleapis.com/token 您的操作向 Google 发出的 Google OAuth 客户端客户端 ID 帮助大纲:169222114038 … 客户端密码:RPF … 客户端Google 向您的 Actions 发布的 ID 帮助大纲:169222114038 ... 范围:个人资料、电子邮件 [x] Google 通过 HTTP 基本身份验证标头传输 clientID 和机密

Intent 调用 Google 登录窗口,用户登录,重定向 URI:oauth-redirect.googleusercontent.com/r/DialogflowBotID(在您可以使用聊天之前,我需要将您的聊天帐户链接到 Google。可以吗?太好了,Tamás!您的学习聊天帐户现已与 Google 相关联。)

  1. 用于网站的 Google 登录 - 使用后端服务器进行身份验证 (developers.google.com/identity/sign-in/web/backend-auth) Google API 客户端库 (github.com/googleapis/google-api-php-client ) 安装在 Moodle 服务器上。login.php 和 callback.php 文件与 client.php 位于同一目录中。mysite/login.php 调用 Google 登录窗口 (accounts.google.com/signin/oauth ...) 并将被重定向到 mysite/callback.php callback.php 处理 OAuth 服务器响应验证令牌和包含:用户数据、电子邮件地址(与 Moodle 中的电子邮件地址相同) access_token: ya29.a0 ... refresh_token = 1//09M8- ... id_token = eyJhbGciOi ... 回调。

callback.php 文件将被重定向到 DialogflowBot:

$redirect_url = 'https://oauth-redirect.googleusercontent.com/r/DialogflowBotID#access_token=' . $access_token . '&token_type=bearer&state=' . $STATE_STRING;
header('Location: ' . filter_var($redirect_url, FILTER_SANITIZE_URL));

Actions Console – 在模拟器中测试:在您可以使用学习聊天之前,我需要将您的学习聊天帐户链接到 Google。可以吗?Yes Linked: 太好了,塔玛斯!您的学习聊天帐户现已与 Google 相关联。

1 2 3 4 5 服务分开工作。

我的问题是:

  1. developers.google.com/assistant/identity/oauth-concept-guide 说:在用户登录并验证凭据后,您的服务会创建一个长期存在的访问令牌并将其返回给 Google。如何在后端服务器上创建长期访问令牌?

  2. 用户验证后,如何将 callback.php 重定向到 Dialogflow 机器人?我用这个:

    $redirect_url = 'https://oauth-redirect.googleusercontent.com/r/DialogflowBotID#access_token='。$access_token 。'&token_type=bearer&state=' 。$STATE_STRING; header('位置:' . filter_var($redirect_url, FILTER_SANITIZE_URL));

这合适吗?

  1. client.php 提供 JSON webhook 响应,但不包含令牌和状态。callback.php 包含令牌和状态,但无法应答 webhook。如何连接 client.php、login.php、callback.php 文件?

  2. 我试图注销用户并取消关联该帐户。

    未设置($_SESSION["auto"]); 未设置($_SESSION['accesToken']);$client->revokeToken(accessToken); $client->revokeToken();

用户如何取消关联的帐户?在电话上?还是在网站上?

在此处输入图像描述

标签: dialogflow-esactions-on-googlegoogle-signin

解决方案


  1. 长期令牌的实施是您的实施。请注意其中的一些注意事项

  2. 正确的。更多信息,请参阅处理授权请求

  3. 不熟悉你的实现。对服务器端的每个请求都将包含访问令牌。所以,这是你的实现。

  4. 另外,这是您的实现。但本质上,您需要一种方法来跟踪长期存在的令牌。


推荐阅读