Google Assistant帐户链接-后端身份验证

时间:2020-07-23 13:15:01

标签: dialogflow-es actions-on-google google-signin

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

已实施的服务

  1. Dialogflow和Moodle通过Webhook连接。 实现– 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表中。用Google的术语来说:后端服务器中存在用户的信息。

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

意图调用Google登录窗口,用户登录重定向URI:oauth-redirect.googleusercontent.com/r/DialogflowBotID (在您可以使用聊天之前,我需要将您的聊天帐户链接到Google。可以吗?很好,塔玛斯!您的学习聊天帐户现在已链接到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从后端服务器数据库中选择用户电子邮件地址,如果(存储的后端电子邮件= =收到的令牌电子邮件)为用户建立了一个经过身份验证的会话。

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控制台–在模拟器中进行测试:在您可以使用学习聊天之前,我需要将您的学习聊天帐户关联到Google。可以吗?是 关联:太棒了,塔玛斯!您的学习聊天帐户现已链接到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('Location:'。filter_var($ redirect_url,FILTER_SANITIZE_URL));

这合适吗?

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

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

    unset($ _ SESSION [“ auto”]); 未设置($ _SESSION ['accesToken']); $ client-> revokeToken(accessToken); $ client-> revokeToken();

用户如何取消关联帐户的链接?在电话上?或在网站上?

enter image description here

1 个答案:

答案 0 :(得分:0)

  1. 长期令牌的实现是您的实现。请注意these considerations中的某些内容。

  2. 正确。有关更多信息,请参见Handle authorization requests

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

  4. 这也是您的实现。但从本质上讲,您需要一种跟踪长期令牌的方法。