我正在使用Actions on Google
(在移动电话Google Assistant
上(,并且通过使用其Account Linking
我已登录Auth0
(登录窗口: 图像(。
但是,我想随时从Auth0
注销,以便我可以从头开始测试整个过程。
我按照Auth0
文档 (https://auth0.com/docs/logout( 编写了以下源代码,Python
和Flask
。
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
(图像(。
但是,当我在手机上重新启动整个过程时,再次出现登录窗口,并且我已经使用相同的accessToken
登录Auth0
。
如何通过清除会话和/或http://127.0.0.1:5000
上的cookie来正确注销,从而使Auth0
登录窗口再次出现?
附言
1(请记住,现在我正在Python
和ngrok
做这一切。如果我重新启动ngrok
会话,则登录窗口将重新出现,但显然我想以编程方式执行此操作。
2(请不要认为任何事情是理所当然的。我可能在我正在做的事情中遗漏了一些非常基本的东西,所以请随时问我关于这个的非常基本的问题。
我已经向Google支持发送了一条消息,并得到了以下答案:
要取消关联您的帐户,您可以使用此链接 (https://gala-demo.appspot.com(,在"服务 ID"字段中输入 项目 ID 并在末尾添加"_dev"(在您的情况下,它将是 "第聂伯罗-Chatbot_dev"(,然后点击取消关联我的帐户。
此外,我问他们我是否可以以编程方式执行此操作(而不是如上所述仅手动执行此操作(,我得到了以下答案:
我不确定这是否可以在 Python 中完成,但您可以尝试 以下: 如果可以从 oauth 发回 401 状态代码 令牌交换终结点。401 将告诉 AoG 访问令牌 无效,强制 AoG 重新发起账号关联流程。 希望这能帮助你。
总之,您当然可以使用上面的链接取消链接帐户,因为我对其进行了测试,并且效果很好。关于第二个答案,我不确定这是否完全可能,至少在它所说的方式上是可能的。您不能真正以编程方式从 Auth0 发送 401 状态代码。您可以在 Auth0 上执行的操作是将 Auth0 应用程序的 JWT 的过期时间设置得非常低(例如 60 秒(,并以这种方式强制撤销访问令牌。但这又不是一个真正的编程解决方案,我还没有测试过它。
Auth0 中的/v2/logout
终结点旨在从前端通道(即浏览器(使用,因此后端应用程序应返回指向/v2/logout
终结点的302
重定向响应(如果要在清除会话后将用户重定向回特定 URL,可以使用文档中所述的returnTo
参数(。
通过像现在一样发出反向通道请求(服务器到服务器(,会话 cookie 丢失,因此 Auth0 不知道要终止哪个会话。
另请注意,/v2/logout
终结点会清除Auth0 中的会话,但您还必须清除应用程序中的会话。如果使用 Flask,请查看这些 Flask 会话。清晰的示例。