Google宣布他们 "will no longer allow OAuth requests to Google in embedded browsers known as 'web-views'" 。
在Android中,来自WebViews的请求获得标头HTTP_X_REQUESTED_WITH
,该标头设置为应用程序的包名称。虽然这可以被覆盖,但是可以使用WebView向服务器隐藏我们正在请求的内容。我不知道任何其他默认方法来实现这一点。
有没有办法检测服务器端 - 无论客户端做什么,请求来自Android WebView。这是如何由Google完成的?
答案 0 :(得分:8)
不直接回答您的问题(抱歉),但是关于您引用的WebView for OAuth的弃用:即使您找到了避免在OAuth流期间检测到WebView的方法,这样做可能会违反{{3特别是“不要误导谷歌关于应用程序的操作环境”一节。所以我不建议这样做。
通常使用OAuth的自定义标签(例如通过Google API Services: User Data Policy)可以带来更好的用户体验,因为用户可能已经登录Google,允许他们审核您的请求,而无需签名 - 再次。这也是一种更安全的体验。这是迁移的目标 - 为最终用户提供更安全,更有用的OAuth体验: - )
答案 1 :(得分:3)
正如其他人所说,WebView和普通浏览器之间存在一系列差异,但它们都是从浏览器的标题中发送的数据,因此您可以环绕它们。
但是有一个libaray https://github.com/Valve/fingerprintjs2,所以你可以阅读它,看看他们做了什么的细节。因为它创建了一个设备指纹,所以google可以使用像这样的大头钉来检测/
他们也有可能在WebView核心代码中运行自己的Javascript,您无法删除它们,并且可以从中检测到它。因此,除非您将自己的浏览器包装为视图,否则您将无法绕过检测。
也可以像上面的方法一样,他们可以在隐藏的iframe中使用chrome://系统,并从中检测内容以识别EG chrome:// about-view /并打印硬编码的User-Agent 。再次环绕这个的唯一方法就是推出自己的浏览器。
正如@WilliamDenniss所说,如果他们发现他们可能会阻止您的应用和您的帐户以及您帐户中的所有应用并阻止您再次从该帐户发布应用,那么就会执行标题环球航行。
答案 2 :(得分:2)
我不认为Google计划对WebView进行任何形式的暴力检测,我认为政策变化只是为了开始一个新的规范。谷歌不必强制执行它,如果它成为常态,用户会发现应用程序建议通过嵌入式浏览器登录是阴暗的 - 用户将需要合规性。 (我并不是说应用程序的每个用户都必须提出这样的请求,但是对于任何对至少一个声音至关重要的应用而言,我都在下注。)
答案 3 :(得分:1)
通过webview发送的所有http请求都有X-Requested-With
标题,可用于检测请求是否来自webview。
X-Requested-With: the.app.packageName
答案 4 :(得分:1)
我想Google不会检测用户代理,因为如果您更改用户代理字符串(如浏览器中的桌面模式),身份验证就会起作用。
但这是来自Google(https://developers.google.com/terms/api-services-user-data-policy)的报价,
请勿误导Google有关应用程序的操作环境。您必须准确表示身份验证页面出现的环境。例如,如果您的应用程序在iOS上运行,则不要在用户代理标头中声明其为Android应用程序;如果您的应用程序的身份验证页面是在嵌入式浏览器中呈现的,则不要表示您的应用程序的身份验证页面是在桌面浏览器中呈现的
很有意思的是,一些流行的基于Webview的浏览器(Dolphin,Firefox Lite等)使用了已修改的用户代理字符串。不再有“ disallowed_user_agent”错误。他们在PlayStore待了很长时间。 @William Denniss是对的,但这些应用程序未暂停。因此,我想有一种方法可以做到而又不会违反Google政策。但是需要詹姆斯·邦德找到它,哈哈...
答案 5 :(得分:0)
您可以通过用户代理字符串进行区分。见https://mobiforge.com/research-analysis/webviews-and-user-agent-strings
e.g。默认的chrome浏览器包含以下内容"(KHTML,如Gecko)Chrome / xx.xx ..."但默认的网页浏览具有以下模式"(KHTML,如Gecko)版本/ 4.0 Chrome / xx.xx .."似乎webview有一个额外的版本字符串。