Actions on google Google隐式帐户链接的操作在模拟器/浏览器中工作,但在设备上不工作(通过Google Home app)

Actions on google Google隐式帐户链接的操作在模拟器/浏览器中工作,但在设备上不工作(通过Google Home app),actions-on-google,dialogflow-es,google-home,Actions On Google,Dialogflow Es,Google Home,我已经在Google帐户链接上实现了操作的隐式流,并且正在使用Dialogflow(以前的API.AI)来定义意图 全流程在设备模拟器中工作(来自AOG)。第一个意图得到一个“看起来你的帐户还没有链接…”响应,调试窗格包含一个URL来启动链接: 如果在无缓存窗口中遵循此URI: 我被重定向到我的应用程序的身份验证页面 我选择使用我的Google帐户登录(与上面的[帐户]相同) 我被重定向到google.com,URI栏中有一条成功消息 模拟器现在通过我的应用程序接受操作并正确响应 然而,如果我

我已经在Google帐户链接上实现了操作的隐式流,并且正在使用Dialogflow(以前的API.AI)来定义意图

全流程在设备模拟器中工作(来自AOG)。第一个意图得到一个“看起来你的帐户还没有链接…”响应,调试窗格包含一个URL来启动链接:

如果在无缓存窗口中遵循此URI:

  • 我被重定向到我的应用程序的身份验证页面
  • 我选择使用我的Google帐户登录(与上面的[帐户]相同)
  • 我被重定向到google.com,URI栏中有一条成功消息
  • 模拟器现在通过我的应用程序接受操作并正确响应
  • 然而,如果我使用一个物理的Google Home和Android的gH应用程序遵循同样的流程

  • 设备告诉我帐户尚未链接
  • 打开Google home并点击“链接到[我的应用]”链接
  • 浏览器将打开“身份验证”页面
  • 以用户身份登录
  • 已重定向到带有单个链接“返回应用程序”的白色页面,该链接的href:
    关于:invalid@zClosurez
  • 链接未成功,因此在Google Home上运行意图的其他尝试会得到相同的“帐户尚未链接”响应

    我已经详细检查了中间访问令牌和状态变量,它们都匹配并且看起来格式正确:

    验证URL(应用程序登录页):

    验证后,重定向到(这是带有“返回应用程序”断开链接的白色屏幕):

    因此,就隐式流帐户链接而言,模拟器和物理设备的工作方式似乎有一些不平行之处

    我一直在努力解决这个问题,与AOG支持团队合作了很长一段时间,但都无济于事。还有人看到类似的问题吗

    更新了响应重定向代码:

    通过配置文件和电子邮件作用域的react google登录组件处理登录。关于成功,我们呼吁:

    finish_auth(id_token) {
        let provider = {
                uri: '/api/auth/google_auth',
                params: ['client_id', 'redirect_uri', 'state', 'response_type'],
                name: "Google Assistant"
            }
        if (provider) {
            let data = {};
            provider.params.forEach((p) => {
                data[p] = this.props.location.query[p];
            });
            if (id_token) data.id_token = id_token;
            api.post(provider.uri, data, (res) => {
                if (res.redirect) window.location = res.redirect;
                else if (res.error) toastr.error(res.error);
            });
        } else {
            toastr.error("Provider not found");
        }
    }
    
    provider.uri命中此API终结点:

    def google_auth(self):
        client_id = self.request.get('client_id')
        redirect_uri = self.request.get('redirect_uri')
        state = self.request.get('state')
        id_token = self.request.get('id_token')
        redir_url = user = None
        if client_id == DF_CLIENT_ID:
            # Part of Google Home / API.AI auth flow
            if redirect_uri == "https://oauth-redirect.googleusercontent.com/r/%s" % secrets.GOOGLE_PROJECT_ID:
                if not user:
                    ok, _email, name = self.validate_google_id_token(id_token)
                    if ok:
                        user = User.GetByEmail(_email, create_if_missing=True, name=name)
                if user:
                    access_token = user.aes_access_token(client_id=DF_CLIENT_ID)
                    redir_url = 'https://oauth-redirect.googleusercontent.com/r/%s#' % secrets.GOOGLE_PROJECT_ID
                    redir_url += urllib.urlencode({
                        'access_token': access_token,
                        'token_type': 'bearer',
                        'state': state
                    })
                    self.success = True
            else:
                self.message = "Malformed"
        else:
            self.message = "Malformed"
        self.set_response({'redirect': redir_url}, debug=True)
    

    不确定您正在使用哪些python中间件或模块,但

    self.set_response({'redirect': redir_url}, debug=True)
    
    似乎正在为返回不正确的响应设置参数。相反,您应该将响应重定向到重定向url。例如,在Flask或Django中导入重定向模块:
    从flask导入重定向
    从django.shortcuts导入重定向
    然后像这样重定向:

    return redirect(redirect_url)
    

    谷歌似乎已经做出了一项改变,部分解决了这个问题,因为现在可以在模拟器之外完成隐式帐户链接流,就像我在问题中概述的那样

    问题似乎源于使用Google登录按钮登录后使用的客户端重定向案例的奇怪处理(在AOG端)

    来自杰夫·克雷格:

    当前的解决方法是,我们提供“返回应用程序”链接 目前我们所能提供的。问题在于它的方式 重定向到自定义方案URI是在Chrome中处理的,特别是, 关于在用户操作上下文中发生的重定向

    XHR将破坏该上下文,因此所发生的是您单击 谷歌登录按钮触发对谷歌服务器的XHR, 然后(很可能)执行客户端重定向,返回到 重定向我们提供的url,我们的处理程序执行,并且无法执行 JS重定向到应用程序的自定义方案URI,因为我们在外部 直接用户单击的上下文

    这更多的是隐式(response_type=token)流的问题 而不是授权代码(响应类型=代码)流 “返回应用程序”链接是我们目前最好的回退案例, 尽管我们也一直在寻找更好的解决方案


    当前行为显示“返回应用程序”链接,但截至上周,此链接的href不再是关于:invalid@zClosurez,但成功完成了登录和链接过程。这是一个奇怪且令人困惑的用户体验,我希望谷歌在未来能有所改进,但这足以让我的应用程序获得AOG团队的批准,而不需要对我的流程进行任何更改。

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

    转到google云控制台->APIsand服务->凭证->OAuth 2.0客户端ID->Web客户端->记录客户端ID、客户端机密->下载JSON-从JSON记录项目ID、auth_uri、,令牌\u uri->授权重定向uri->白名单我们的应用程序的URL->在这个URL固定部分是,并在URL中追加项目id->保存更改

    谷歌->帐户链接设置1上的操作。授权类型=授权代码2。客户信息1。填写客户端id、客户端密码、身份验证uri、令牌uri 2。将身份验证uri输入为,将令牌_uri输入为3。保存并运行4。在谷歌助手上运行时,它会显示一个错误,但不要担心。回到助手设置中的帐户链接部分,输入auth_uri as和token_uri as 6。把望远镜放好,我们可以走了。7.保存更改

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

    将访问令牌附加到此链接“”中,我们可以在生成的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"])`
    

    在手机上的谷歌助手应用程序中进行测试时,是否也会出现同样的行为?您是否可以更新您的问题以包含您重定向到的URL?(屏蔽您的项目ID、访问令牌和状态?@Nazeem yes。围棋