我正在尝试在当前的Android应用程序中实现OAuth单一登录/退出。
我正在使用Chrome自定义标签
implementation 'com.android.support:customtabs:28.0.0'
登录正常,Chrome“自定义”标签存储了用户Cookie,所有登录流程均按预期进行。
新登录:
更新:由于我的Android设备已收到Chrome对版本72的更新,因此以上操作已停止。请参阅我的相关文章question
如果chrome的安全策略不允许在没有关联的用户交互的情况下进行重定向,那么为什么当我加载第一个URL提示为none的登录网址时,为什么会收到“新意图”?此时,还没有用户交互。即使更新到Chrome 72并已用提示符=登录打破登录后,此步骤仍然可以正常进行,并且在第二步中,用户可以进行交互,因为用户不仅需要输入用户名和密码,然后单击登录按钮。
当我在两个提示中都添加“同意”时,用户可以登录“提示=未同意”,然后输入“提示=登录同意”,但是在允许他们继续操作之前,会向他们显示“批准”屏幕进入我的应用程序。为什么添加“同意”可以使我的登录过程正常运行? “批准”屏幕从何而来?
后续登录:
我在退出时遇到问题。
当用户单击我的应用程序中的“退出”按钮时,该应用程序通过自定义的Chrome标签加载了退出URL
,但它被“卡住了”。用户看到的屏幕是空白的空白屏幕。
我相信这是由于此问题CCT get stuck...
中提到的Chrome自定义标签的安全性限制所致更准确地说,这句话:
Chrome强制执行一项政策,该政策只会将重定向发送到您的 如果重定向是由用户操作(例如提交)触发的,则为app 重定向或单击链接的表单。
我看到的是,即使没有用户交互,我们的用户也可以始终以无问题的方式静默登录,就像当我们尝试使用CCT加载退出URL时,我们总是在空白处看到“ STUCK” CCT页面。
我不明白的是为什么无提示登录有效而“程序化”退出却无效,而这两个原因都没有涉及用户交互。
如果我不得不猜测,我会说登录在CCT检测到用户Cookie时起作用,并接受这些Cookie只能与相关的用户交互一起存储。
“登出”根本没有任何用户交互。
如何解决我的CCT退出问题?
我需要将URL加载到承载“退出”按钮的网页上吗?
答案 0 :(得分:1)
为避免所有这些问题,建议您实施一个暂存页面,该页面将用于处理所有OAuth2重定向。
AFAIK重定向到网页不需要用户同意,并且与重定向到App相比,受到的限制较少。
因此,您的逻辑将更改为以下内容:
新登录:
Access Token
与注销过程相同。在您的网页中,您将拥有一个自动重定向(例如使用JS)和一个故障转移选项,用户单击一个按钮即可返回您的应用程序。您的页面看起来像这样:
<!doctype html>
<html lang="en">
<head>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("redirectButton").click();
setTimeout(function() {
window.location.href = "{{ path('homepage') }}";
}, 10000);
});
</script>
</head>
<body>
<p>Redirecting to XXX app, it will only take few seconds...</p>
<a href="{{ redirect_url }}" id="redirectButton">Click here to go back to XXX App</a>
</body>
</html>
请注意,此过程可能很快,用户甚至可能看不到此页面