如何使用Chrome自定义标签实施OAuth单一登录/注销

时间:2019-01-28 09:13:49

标签: android oauth-2.0 chrome-custom-tabs

我正在尝试在当前的Android应用程序中实现OAuth单一登录/退出。

我正在使用Chrome自定义标签

 implementation 'com.android.support:customtabs:28.0.0'

登录正常,Chrome“自定义”标签存储了用户Cookie,所有登录流程均按预期进行。

新登录:

  1. 清除Chrome cookie
  2. 清除应用存储空间
  3. Android应用程序通过Chrome自定义标签加载登录网址
  4. 用户必须输入用户名和密码
  5. 使用自定义方案“回调”将URL重定向到我的Android应用,并且我收到了有效的访问令牌。

更新:由于我的Android设备已收到Chrome对版本72的更新,因此以上操作已停止。请参阅我的相关文章question

如果chrome的安全策略不允许在没有关联的用户交互的情况下进行重定向,那么为什么当我加载第一个URL提示为none的登录网址时,为什么会收到“新意图”?此时,还没有用户交互。即使更新到Chrome 72并已用提示符=登录打破登录后,此步骤仍然可以正常进行,并且在第二步中,用户可以进行交互,因为用户不仅需要输入用户名和密码,然后单击登录按钮。

当我在两个提示中都添加“同意”时,用户可以登录“提示=未同意”,然后输入“提示=登录同意”,但是在允许他们继续操作之前,会向他们显示“批准”屏幕进入我的应用程序。为什么添加“同意”可以使我的登录过程正常运行? “批准”屏幕从何而来?

后续登录:

  1. 该应用程序通过Chrome自定义标签加载登录网址
  2. 使用Chrome自定义标签用户Cookie,以“静默登录”用户。
  3. 用户进入Android应用程序

我在退出时遇到问题。

当用户单击我的应用程序中的“退出”按钮时,该应用程序通过自定义的Chrome标签加载了退出URL,但它被“卡住了”。用户看到的屏幕是空白的空白屏幕。

我相信这是由于此问题CCT get stuck...

中提到的Chrome自定义标签的安全性限制所致

更准确地说,这句话:

  

Chrome强制执行一项政策,该政策只会将重定向发送到您的   如果重定向是由用户操作(例如提交)触发的,则为app   重定向或单击链接的表单。

我看到的是,即使没有用户交互,我们的用户也可以始终以无问题的方式静默登录,就像当我们尝试使用CCT加载退出URL时,我们总是在空白处看到“ STUCK” CCT页面。

我不明白的是为什么无提示登录有效而“程序化”退出却无效,而这两个原因都没有涉及用户交互。

如果我不得不猜测,我会说登录在CCT检测到用户Cookie时起作用,并接受这些Cookie只能与相关的用户交互一起存储。

“登出”根本没有任何用户交互。

如何解决我的CCT退出问题?

我需要将URL加载到承载“退出”按钮的网页上吗?

1 个答案:

答案 0 :(得分:1)

为避免所有这些问题,建议您实施一个暂存页面,该页面将用于处理所有OAuth2重定向。

AFAIK重定向到网页不需要用户同意,并且与重定向到App相比,受到的限制较少。

因此,您的逻辑将更改为以下内容:

新登录:

  1. 清除Chrome cookie
  2. 清除应用存储空间
  3. Android应用程序通过Chrome自定义标签加载登录网址
  4. 用户必须输入用户名和密码
  5. 将URL重定向到您的Web应用程序,然后将使用它得到的任何参数将URL重定向到您的应用程序,即。 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>

请注意,此过程可能很快,用户甚至可能看不到此页面