如何取消 Actions on Google 和 Auth0 之间的帐户关联

Posted

技术标签:

【中文标题】如何取消 Actions on Google 和 Auth0 之间的帐户关联【英文标题】:How can I unlink account between Actions on Google and Auth0 【发布时间】:2018-11-08 08:42:44 【问题描述】:

我正在使用Actions on Google(在手机上Google Assistant)并使用它的Account Linking登录Auth0登录窗口 : image)。

但是,我想随时从Auth0 注销,以便从头开始测试整个过程。

我在 Auth0 文档 (https://auth0.com/docs/logout) 之后在 PythonFlask 中编写了以下源代码。

from flask import Flask, render_template, request, jsonify
import requests

app = Flask(__name__)
@app.route("/", methods=['GET', 'POST'])
def index():

    session['user'] = 'Poete_Maudit'

    data = request.get_json()

    if data is not None:
        action = data["queryResult"]["action"]
    else:
        return 'HERE'

    # Triggers actions.intent.SIGN_IN which leads to Auth0
    if (action == 'sign'):

        return jsonify("payload": 
                    "google": 
                        "expectUserResponse": True,
                        "isSsml": False,
                        "noInputPrompts": [],
                        "systemIntent": 
                            "data": 
                                "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec"
                            ,
                            "intent": "actions.intent.SIGN_IN"
                        
                      
                     
                    )
    # I have other if statements below which retrieve the access token 
    # and do in general other stuff on Actions on Google app
    # but it is too long to include it here

@app.route('/logout')
def logout():
    session.clear()
    return redirect('https://project_id.eu.auth0.com/v2/logout?returnTo=http://127.0.0.1:5000')

if __name__== "__main__":
    app.secret_key = os.urandom(24)
    app.run(debug=True)

在我执行了整个登录过程后,我手动(从浏览器)转到http://127.0.0.1:5000/logout,它成功地将我重定向到http://127.0.0.1:5000。在 python 控制台我得到:

127.0.0.1 - - [06/Jun/2018 14:09:04] "GET /logout HTTP/1.1" 302 -
127.0.0.1 - - [12/Jun/2018 11:03:16] "GET / HTTP/1.1" 200 -

Auth0 日志部分,我收到了Success Logout (image)。

但是,当我再次在手机 Google Assistant 上重新启动整个过程时,登录窗口并没有出现,我再次以相同的方式登录 Auth0 accessToken.

我怎样才能通过清除会话和/或http://127.0.0.1:5000 上的 cookie 来正确注销,从而使 Auth0 登录窗口再次出现?

附:

1) 请记住,目前我正在使用Pythonngrok 进行所有这些操作。如果我重新启动 ngrok 会话,那么登录窗口会重新出现,但显然我想以编程方式执行此操作。

2) 请不要把任何事情视为理所当然。我在做的事情中可能遗漏了一些非常基本的东西,所以请随时问我一些非常基本的问题。

【问题讨论】:

【参考方案1】:

我已向 Google 支持发送了一条消息,并得到了以下答复:

要取消关联您的帐户,您可以使用此链接 (https://gala-demo.appspot.com),在字段服务 ID 中输入 项目 ID 并在末尾添加“_dev”(在您的情况下,它将是 “Dnipro-Chatbot_dev”),然后点击取消关联我的帐户。

此外,我问他们是否可以通过编程方式执行此操作(而不是像上面那样手动执行),我得到了以下答案:

我不确定这是否可以在 Python 中完成,但您可以尝试 以下:如果您可以从您的 oauth 发回 401 状态代码 令牌交换端点。 401 将告诉 AoG 访问令牌 无效并强制 AoG 重新启动帐户链接流程。 希望对您有所帮助。

总之,你当然可以使用上面的链接来取消我测试过的帐户的链接,它工作正常。关于第二个答案,我不确定这至少在陈述的方式上是否完全可行。您不能真正以编程方式从 Auth0 发送 401 状态代码。您可以在 Auth0 上做的是将 Auth0 应用程序的 JWT 的到期时间设置得非常低(例如 60 秒),从而强制撤销访问令牌。但这又不是真正的程序化解决方案,我还没有测试过。

【讨论】:

【参考方案2】:

Auth0 中的/v2/logout 端点用于从前端通道(即浏览器)使用,因此您的后端应用程序应返回指向/v2/logout 端点的302 重定向响应(您可以使用returnTo 参数如文档中所述,如果您想在清除会话后将用户重定向回特定 URL)。

通过像现在这样(服务器到服务器)发出反向通道请求,会话 cookie 丢失,因此 Auth0 不知道要终止哪个会话。

还要注意/v2/logout 端点会清除in Auth0 中的会话,但您还必须清除应用程序中的会话。如果使用 Flask,请查看这些Flask session.clear examples。

【讨论】:

感谢您的回答(点赞)。我并不完全了解您在这里提到的技术细节,所以您的回答对我来说有点密集。例如:1)我的HTTP请求的url和参数应该是什么?,2)Flask.session clear有必要吗?我不想将用户重定向到任何地方,而只是在死时间(当用户不使用我的 Python 应用程序时)注销用户,以便用户在她/他再次使用我的应用程序时可以重新登录从头开始(用于测试目的)。 正如我所说,/v2/logout 是从浏览器请求的。这是为了让浏览器发送会话 cookie,并且 Auth0 可以识别谁在请求注销并清除会话。这样做的方法是从服务器返回一个重定向响应,它指示浏览器向新位置(即/v2/logout 端点)发出新请求。由于您不希望用户只进入一个空白的“OK”页面,因此您可以使用 returnTo 参数将用户重定向回其他位置(例如应用的主页)。 至于会话,正如logout docs 解释的那样,您需要牢记三个会话: - 应用程序中的会话(我们无法明确,由您管理) . - Auth0 的会话(通过将用户重定向到 /v2/logout 来清除它) - 上游身份提供者的会话(如 Google)。您可以使用federated 参数清除它,但通常不建议这样做(大多数用户不喜欢外国应用程序清除会话)。 如果您只是在 Auth0 清除会话,您的应用程序仍然“知道”用户是谁,因此当您请求新令牌时它可能会跳过请求新令牌。但这有点超出身份提供者 (Auth0) 的范围,并且与您的应用程序的整体架构更相关。 @app.route('/logout') def logout(): session.clear() return redirect('yourtenant.auth0.com/v2/logout?returnTo=' + url_for('/​​'))

以上是关于如何取消 Actions on Google 和 Auth0 之间的帐户关联的主要内容,如果未能解决你的问题,请参考以下文章

Actions on Google - 在我的 Android 设备上测试我的项目

在 Actions on Google 应用上设置语音识别上下文?

Actions-on-Google 自定义推送消息说明

帐户关联问题(Actions on Google)

Actions on Google - 哪里可以找到 gactions CLI 的最新文档

order-update.js 在事务 api actions-on-google 中发送“”作为响应