Google 登录在网页应用里失败:该查什么
网站在 Pake 应用里能正常打开,登录却失败,从外面看有三种情况长得很像,服务商拒绝内嵌浏览器、弹窗开在了不对的地方,或者会话没有保存下来。先读错误信息,如果是 Google 对内嵌浏览器的拒绝,Pake 里没有任何设置能解决,只能在正常的浏览器里用这个网站,另外两种原因则有可以调的设置。
改设置之前,先读真实的报错
Google 的 OAuth 政策规定,开发者不得把授权请求导向内嵌的用户代理,Pake 应用正是这样一种内嵌用户代理,它是系统网页视图外面套的一个窗口。Google 的错误参考把 disallowed_useragent 列为面向用户的错误,含义是授权端点显示在 Google 政策不允许的内嵌用户代理里,见 Google 的安全浏览器政策和错误参考。Google 的 Web 服务器 OAuth 指南对 Mac 说得更直接,iOS 和 macOS 开发者在 WKWebView 里打开授权请求时可能遇到这个错误,而 Pake 应用在 macOS 上用的正是 WKWebView,指南还专门提到另一种情况,应用在内嵌视图里打开一个普通网页,用户再从那个网站点进 Google 登录,Pake 窗口里的「使用 Google 继续」就属于这一种。
拒绝来自登录页本身,不来自 Pake,所以改 User Agent 不是被支持的绕过办法,请在受支持的浏览器或官方客户端里使用这个服务。在浏览器里登录过,也不会把浏览器的 Cookie 交给另一个 Pake 应用,因为两者的存储是分开的。
这一点适用于所有用“使用 Google 继续”登录的网站,不只是 Google 自己的产品。网站如果同时提供自己的邮箱密码表单,这是实际可行的例外,因为那个表单不经过 Google。Pake 也能识别其他服务商的登录页,但识别只是把页面留在应用里,不会改变任何服务商的政策。
Pake 怎么处理登录链接
Pake 把一些地址当作身份验证,留在应用里,不交给浏览器。它的脚本能识别 accounts.google.com 及各国家变体、login.microsoftonline.com、appleid.apple.com,也识别 /oauth、/auth、/authorize、/signin、/login 这类路径、Facebook 的对话框端点,以及来自 Okta、OneLogin 和 SAML、ADFS 路由的企业单点登录。新窗口在应用内打开没开时,点击这类链接会让当前窗口直接跳过去,整条重定向链和回程都在同一个网页视图里,打开时,Windows 上登录会在应用的另一个弹出窗口里进行,Mac 上除了 Sign in with Apple,仍然在当前窗口里跳转。
没有被识别成验证的地址,走普通的链接规则,指向同一网站或其上级域名的链接留在应用里,其他链接用浏览器打开。“登录时跳去了我的浏览器”通常就是这个原因,服务商所在的域名被应用当成了外部域名。高级里的内部链接正则可以把它留在应用里,CLI 里还有 --safe-domain,用来列出 slack.com,okta.com 这样可信的域名。
看登录流程是不是需要新窗口
有些网站在弹窗里开始登录。点按钮后跳出一个意外的浏览器窗口,或者流程走不完,就试一下运行偏好里的新窗口在应用内打开,点保存修改再重试,选项说明见创建应用,多窗口是另一个设置,管的是应用自己能不能显示多个窗口。
这个设置改变的是新窗口去哪里,不保证兼容所有登录服务商,也绕不开上面 Google 的政策,同样的拒绝还在,就回到受支持的浏览器。Pake 自己的常见问题对 CLI 的 --new-window 和 --multi-window 给的也是同一个答案,它们对基于弹窗的登录有帮助,但绕不开服务商的政策。
Mac 上页面做不到的两件事
有两处 Mac 上的限制很容易被当成故障。Pake 会让 Sign in with Apple 的弹窗走原生弹窗路径,好让 Apple 的回调能回到打开它的页面,其他验证弹窗则可能在当前窗口里跳转,避免 WebKit 崩溃。Mac 上的 Pake 应用也没有通行密钥和 Touch ID 登录,因为系统只把它们提供给浏览器,以及与网站域名绑定的应用,请改用密码加两步验证码登录。
看登录为什么消失
登录成功了,退出后又没了,就检查无痕浏览。它每次启动都是干净的会话,刻意不保留登录、Cookie 和网站数据,想让应用在两次使用之间保留这些,就把它关掉。精选里的微信应用就是在无痕浏览下运行的,所以每次都要扫码。
网站自己也可能让会话过期。拿同一个服务在浏览器里对照一下,记下是退出后马上丢失,还是过了一段时间才丢。编辑应用不会丢登录状态,见管理应用。不要把删除应用数据当成排查的第一步。
一个正常的设置是什么样
对允许内嵌登录的网站,检查很简单:创建应用时让无痕浏览保持关闭,除非登录会弹出窗口,否则让新窗口在应用内打开保持关闭,登录一次,退出,再打开确认还在登录状态。需要第二个账号的话,用分开的账号应用。网站要求的是它认识的浏览器,那是另一个问题,见 User Agent 教程。
反馈时把失败的那一步说清楚
服务商没有说明内嵌浏览器限制,上面的设置也解释不了现象,就报告网站、操作系统、Pake 版本、完整的报错文字,以及出现在哪一步。隐去个人信息的截图有用,密码、Cookie 和访问令牌不需要。到 github.com/tw93/Pake 提交问题,并写明用的是哪个应用、哪个系统。
登录限制在 Pake 常见问题里也有说明。
常见问题
把 User Agent 改成 Chrome 的不行吗?
对 Google 不行,他们的政策针对的是内嵌浏览器,User Agent 不是被支持的绕过办法,只检查字符串的网站见 User Agent 教程。
浏览器安装的应用算一条出路吗?
Pake 的常见问题对这类网站给出的办法是正常的浏览器、浏览器安装的应用,或者原生桌面客户端,Pake 应用不在其中。
为什么同一个网站在浏览器里正常?
浏览器对服务商来说是受支持的环境,内嵌网页视图则不是,两者的 Cookie 也是分开的。
