使用 Google 会话和帐户选择器的移动应用浏览器的行为

Posted

技术标签:

【中文标题】使用 Google 会话和帐户选择器的移动应用浏览器的行为【英文标题】:Behaviour of mobile app browsers with Google sessions and Account Chooser 【发布时间】:2017-07-18 03:10:50 【问题描述】:

问题:尝试在移动应用之间创建 SSO。和浏览器。

我们拥有的:

我们有一个 ionic 移动应用。使用 OAuth 2.0 身份验证“使用 Google 登录”。我们有多个适用于 OAuth2 和 SAML 的内部应用程序,因此,我们为 GSuite 启用了 SSO,以便所有应用程序都可以使用一个登录名和密码无缝运行。现在,当我们点击“使用 Google 登录”按钮时,

    在浏览器应用程序中打开 SSO 登录页面。我们启用了 SSO 因此我们设置了 login_hint,它可以帮助我们直接将我们带到 SSO 登录页面。

    用户输入用户邮箱和密码,然后重定向到 redirect_uri 使用 OAuth 2 代码参数发布成功的身份验证。

    redirect_uri 的完成方式是,当触发 url 时, 它使用 OAuth 2 代码参数再次重定向回我们的 android 应用程序和 然后我们从 token 中提取 access_token 和 useremail 用户信息端点。

    根据授权,仪表板显示指向我们内部的链接 应用。适用于 Google SAML 2.0 或 OAuth2 身份验证。

预期结果:

当用户从移动应用点击任何 SAML/OAuth 2 链接时。仪表板,我们在浏览器应用程序中打开该链接。它应该会自动登录到该应用程序。并将我们带到登录页面,因为我们已经在步骤#a 中设置了 Google 会话。

出乎意料的事情:

当我们尝试访问 SAML/OAuth 应用程序时,如果在 Chrome 浏览器中设置了一个配置文件,其中列出了设备中同步的所有帐户,但没有一个用户使用 #b 登录,它会显示帐户选择器。它应该显示该帐户或直接登录并显示登录页面。当我们没有设置 chrome 配置文件时,它不会发生。 当我们执行以下操作时,所有浏览器中的会话都会自动终止,因此会再次要求提供凭据。 关闭浏览器选项卡(有时)。 从最近的应用程序托盘中清除浏览器(大部分时间) 重启设备(总是)

想了解如何以及何时在手机的 Google Chrome 中自动创建和终止会话?

有什么地方可以保持会话完整吗? |有没有办法绕过显示与手机同步的帐户的帐户选择器?

更新

能够弄清楚奇怪的观察: 我们关闭了 SSO,以便显示 Google 登录屏幕。有了这个一切正常。即使重新启动浏览器或手机,无论 Android 还是 ios,会话都不会被终止。

所以问题出在我们设计的 SSO 中。无法弄清楚要在我们发布到 Google 的 ACS URL 的 SAML XML 中设置什么。

【问题讨论】:

【参考方案1】:

1。想了解如何以及何时在手机的 Google Chrome 中自动创建和终止会话?

我认为 Google Chrome 在手机中的行为与在计算机中的行为方式相同,因此使用html5 sessionStorage、用户configuration 和设备policies 创建和终止会话:

到目前为止,Web Storage 有两种类型,它们是 localStorage 和 sessionStorage。主要区别在于 localStorage 持续存在于不同的选项卡或窗口中,即使我们 关闭浏览器,相应地使用域安全策略和 用户对配额限制的选择。

另外,重要的是要知道how Chrome saves and syncs passwords:

Chrome 如何保存和同步密码(在计算机和 Android 设备中)取决于您是否要存储 并跨设备使用它们。同步后,密码可用于 您所有设备上的 Chrome 浏览器,以及您 Android 上的某些应用程序上的 Chrome 设备。

如果以下任一情况,您的密码就会保存到您的 Google 帐户中 以下是正确的:

您已登录 Chrome 并正在同步密码 您正在使用 Android 上用于密码的 Smart Lock

否则,您的密码只会存储在您计算机或 Android 设备上的 Chrome 上。

Chrome 如何保存和同步密码(在 iPhone 和 iPad 设备中)取决于您是否要跨设备存储和使用密码。

如果您已登录,您的密码将保存到您的 Google 帐户中 Chrome 并正在同步密码。

否则,您的密码只会存储在 iPhone 上的 Chrome 或 iPad。


2。有什么办法可以保持会话不变?

我对 iO 或 HTML5 开发不熟练/不感兴趣,但当 Google 推出 Smart Lock for Passwords on Android 时,我尝试了类似的 Android 和旧版 Google Apps 域:

以编程方式保存和检索凭据,并自动签名 Chrome 中跨设备和网站的用户。

注意:您的服务器上需要 SSL 到 Enable automatic sign-in across apps and websites

Smart Lock for Passwords 和 Connected Accounts API 有助于保存和检索您的应用和相关网站的凭据

你可以Handle multiple saved credentials和manually Delete stored credentials

当需要用户输入来选择凭据时, getStatusCode() 方法返回 RESOLUTION_REQUIRED。在这种情况下,调用 状态对象的 startResolutionForResult() 方法来提示 用户选择一个帐户。然后,检索用户选择的 通过传递来自活动的 onActivityResult() 方法的凭据 Credential.EXTRA_KEY 到 getParcelableExtra() 方法。

当凭据对象的用户 ID 与在设备上登录的 Google 帐户的用户 ID 匹配时,Sign In Using ID Tokens 可用。

如何implement it 和有用的场景test 和check 在相关的SO 答案中。


3。有没有办法绕过显示与手机同步的帐户的帐户选择器?

Use Google Sign-In with IT Apps

将应用列入白名单,这样您的用户就不会看到 登录时的确认屏幕。此步骤与 后续步骤(第 4 点:将帐户的 Google for Work 域传递给身份验证服务器,因此登录期间仅显示该域中的帐户),确保您的 IT 应用程序的用户可以 自动登录。要将您的应用列入白名单:

打开G Suite Admin Console。 点击安全图标,然后点击显示更多 > 高级设置 > 管理 API 客户端访问。

输入您为应用程序注册的 OAuth 客户端 ID。客户 ID 通常是一串字母和数字,后跟 .apps.googleusercontent.com。 在 API 范围字段中,键入以下字符串:https://www.googleapis.com/auth/plus.me,https://www.googleapis.com/auth/userinfo.email 如果您的应用需要请求其他范围来访问 Google API,请在此处指定。 单击授权。白名单将在大约 30 分钟后生效。

注意:如果应用启动 OAuth/Open ID Connect 流程并包含参数 offline提示。 IT 应用程序通常不需要这些参数。

Force/bypass google account chooser in OAuth2 authorization URLs

OAuth2 授权 URL 支持以下参数:prompt

目前它可以有值“none”、“select_account”和“consent”。

none:将导致 Google 不显示任何 UI,因此如果用户显示失败 需要登录,或者多登录的情况下选择一个账号,或者 同意,如果第一次批准。它可以在不可见的 i-frame 中运行以 在您决定之前从先前授权的用户那里获取令牌,因为 例如,呈现一个授权按钮。

同意:将强制显示批准页面,即使用户 之前已授权您的申请。可能在少数有用 极端情况,例如,如果您丢失了用户的 refresh_token, 因为 Google 仅在明确同意操作时发布 refresh_tokens。

select_account:将导致显示帐户选择器,即使 正如你所问的,只有一个登录用户。

select_account 可以与同意结合,如:prompt=select_account+consent

using authorisation via the JS client library

您没有看到多用户选择屏幕,因为 以下参数:authuser=0 这会自动选择第一个 您登录的帐户(authuser=1 将选择第二个 等等)。


4。更新:关闭 SSO 后一切正常...会话不会被终止...

SAML-based Federated SSO

Here's how to set up Single Sign-On (SSO) via SAML for the Slack® application.

使用安全断言标记语言 (SAML),您的用户可以使用 用于登录企业云的 Google Cloud 凭据 应用程序。

作为管理员,您必须配置一些东西才能使其正常工作, 包括:

将选定的应用程序设置为 SAML 服务提供商 (SP)。 将 G Suite 设置为 SAML 身份提供商 (IdP)。 在 Google 管理控制台中输入特定于应用程序的服务提供商详细信息。 为应用程序启用单点登录 (SSO)。 验证 SSO 是否正常工作。

Configure the pre-integrated cloud applications or your own SAML app

Sign in。单击应用程序 > SAML 应用程序。选择 将服务/应用添加到您的域并设置:

Turn on SSO to your new SAML app:

登录您的Admin console。去 应用程序 > SAML 应用程序

选择应用程序。在灰色框的顶部,单击更多设置,然后 选择:

为所有人开启为所有用户开启服务(再次点击确认)。 关闭以关闭所有用户的服务(再次单击以确认)。 为某些组织启用,仅针对某些用户更改设置。

Use Google Sign-In with IT Apps

以下是使用 Google 时应采取的步骤清单 使用工作帐户登录定制开发的 IT 应用程序。如果 您正在开发移动应用程序,请同时参考best practices for mobile。

如果您的应用知道帐户的 Google for Work 域,您 应该将该域传递给身份验证服务器,因此只有该域的帐户 域在登录期间显示。在 Android 上,这是通过 setHostedDomain builder 方法,在 iOS 上,这是通过 hostedDomain 财产。

这也可以使用带有 REST 端点的 hd 参数来完成,并且 带有 javascript API 的 hosts_domain 参数。


5。在我们发布到 Google 的 ACS URL 的 SAML XML 中设置什么。

Configuring Provider Metadata for SAML Integration

SAML 元数据用于在服务器之间共享配置信息 身份提供者 (IdP) 和服务提供者 (SP)。元数据 IdP 和 SP 都在 XML 文件中定义:

IdP 元数据 XML 文件包含 IdP 证书、实体 ID、 重定向 URL 和发布 URL,例如, saml_idp_metadata.xml.

<?xml version="1.0" encoding="UTF-8"?>
  <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="https://test.my.company.com" validUntil="2024-08-13T07:37:40.675Z">
    <md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
      <md:KeyDescriptor use="signing">
        <ds:KeyInfo>
          <ds:X509Data>
            <ds:X509Certificate>encoded_certificate</ds:X509Certificate>
          </ds:X509Data>
        </ds:KeyInfo>
      </md:KeyDescriptor>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
    <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://https://test.my.company.com/idp/endpoint/HttpPost"/>
    <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://test.my.company.com/idp/endpoint/HttpRedirect"/>
  </md:IDPSSODescriptor>
</md:EntityDescriptor>

SP 元数据 XML 文件包含 SP 证书、实体 ID、 和断言消费者服务 URL (ACS URL),例如, saml_sp_metadata.xml.

<EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="http://client.mydomain.com:80/webconsole">
  <SPSSODescriptor WantAssertionsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://client.mydomain.com:80/webconsole/samlAcsCallback.do" isDefault="true"/>
    <KeyDescriptor>
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>encoded_certificate</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:entity</NameIDFormat>
  </SPSSODescriptor>
</EntityDescriptor>

在使用 SAML 登录 Web 控制台之前,来自 IdP 的元数据 必须上传并且必须生成来自 SP 的元数据。之后 SP 元数据生成后,必须与 IdP 共享。联系 IdP 获取有关共享 SP 元数据的说明。

使用 SAML 创建身份提供者 (IdP) 元数据 XML 文件 协议。有关 SAML 元数据规范,请访问Oasis website、Metadata for the OASIS Security Assertion Markup Language (SAML) V2.0。

创建一个密钥库文件。有关密钥库文件的信息,请参阅 Creating Certificates for SAML Integration.

有关 keytool 实用程序的更多信息,请访问 Oracle Documentation website、keytool - Key and Certificate Management Tool。

SAML service provider URLs

要将 G Suite 设置为 SAML 身份提供商 (IdP),您需要输入 每个人的 SAML 服务提供商 URL 您计划设置的预配置云应用程序。

Links 用于实体 每个预配置云的 ID、ACS URL 和启动 URL 值 应用程序。


6。单点登录 (SSO) 疑难解答

This document 提供解决过程中遇到的常见错误消息的步骤 将SAML-based Single Sign-On (SSO) 与 G Suite 集成或使用 Google 是服务提供商 (SP)。

【讨论】:

非常感谢您的帮助:)。如果您对此有所了解,请查看更新部分吗? 不客气,今晚我会更新我的答案,我正在尝试使用预配置的 slack 应用程序和自定义应用程序。检查this link 和g suite help。还要检查安全性、高级设置,一切正常,然后尝试使用a preconfigured app like slack。现在是足球时间:)

以上是关于使用 Google 会话和帐户选择器的移动应用浏览器的行为的主要内容,如果未能解决你的问题,请参考以下文章

移动设备(iOS 和 Android)的 Google 分析会话计数错误

如何将Google Analytics会话与应用会话统一?

区分移动应用程序和桌面浏览器对会话管理的请求

带有日期选择器的 Android 微调器,例如 Google 日历应用

Google Plus 登录帐户选择对话框问题

使用跟踪代码管理器的 Android 内容实验几天后未显示会话