代码之家  ›  专栏  ›  技术社区  ›  Hector

如何使用Chrome自定义选项卡实现OAuth单点登录/注销

  •  1
  • Hector  · 技术社区  · 7 年前

    我正在尝试在我当前的Android应用程序中实现OAuth单点登录/注销。

    我使用的是Chrome自定义标签

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

    登录工作正常,Chrome自定义选项卡存储用户cookie,所有登录流程工作正常。

    1. 清除铬饼干
    2. 用户必须输入用户名和密码
    3. 将带有自定义方案“回调”的URL重定向到我的Android应用程序,我会收到一个有效的访问令牌。

    question

    如果chrome有一个安全策略,它不允许在没有相关用户交互的情况下重定向,为什么我在加载第一个提示为“无”的登录URL时会收到新的意图?目前还没有用户交互。即使在Chrome 72更新后,这一步仍然可以正常工作,该更新破坏了使用prompt=login登录的登录,在这第二步中,用户不仅需要输入用户名和密码,还需要单击登录按钮。

    后续登录:

    1. 用户进入Android应用程序

    我在注销时遇到问题。

    URL 通过一个定制的Chrome标签,但它会被“卡住”。用户看到的屏幕是一个空白的白色屏幕。

    我相信这是由于这个问题中提到的Chrome定制标签的安全限制 CCT get stuck...

    更确切地说,这一说法:

    Chrome强制执行一项策略,即它只向您的用户发送重定向 重定向或单击链接的窗体。

    我不明白的是,为什么静默登录有效,而“编程”注销无效,而它们都没有任何用户交互。

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

    如何解决CCT注销问题?

    我是否需要将URL加载到承载注销按钮的网页?

    1 回复  |  直到 7 年前
        1
  •  1
  •   113408 Dmitry    7 年前

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

    AFAIK重定向到网页不需要用户同意,与重定向到应用程序相比,受限制更少。

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

    1. 清除铬饼干
    2. 清除应用程序存储
    3. Android应用程序加载带有Chrome自定义选项卡的登录URL
    4. 将URL重定向到你的webapp,然后使用它得到的任何参数将其重定向到你的应用,即。 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>