【发布时间】:2017-05-14 17:09:02
【问题描述】:
我使用 NODE 和 EXPRESS 开发了一个简单的 REST api。而且我已经有一个网络应用程序(浏览器)和一个本地移动应用程序。 现在我需要检查传入的请求是来自网络浏览器还是来自本机应用程序。
我已成功检测到设备通过 USER-AGENT 接收来自浏览器的传入请求。
【问题讨论】:
标签: android ios node.js express user-agent
我使用 NODE 和 EXPRESS 开发了一个简单的 REST api。而且我已经有一个网络应用程序(浏览器)和一个本地移动应用程序。 现在我需要检查传入的请求是来自网络浏览器还是来自本机应用程序。
我已成功检测到设备通过 USER-AGENT 接收来自浏览器的传入请求。
【问题讨论】:
标签: android ios node.js express user-agent
我建议使用Host 标头。
例如:
如果您的 Web 应用程序托管在 example.com,那么所有请求的 Host 标头都将设置为 example.com。
在您的移动应用程序中,您可以手动将所有请求标头设置为具有不同的主机标头,例如 Host:app.example.com。
一个很好的做法是让服务器接受的主机名数量有限。
确保您没有对该标头施加任何安全逻辑。每个 HTTP 客户端都可以伪造/覆盖该值。
【讨论】:
window.navigator.standalone 用于 iOS,window.matchMedia('(display-mode: standalone)').matches 用于 Android 来检测:
isInWebAppiOS = (window.navigator.standalone == true);
isInWebAppChrome = (window.matchMedia('(display-mode: standalone)').matches);
为每个设置一个 cookie 以传递给服务器。
参考文献
Android 8.0 Compatibility Definition | Android Open Source Project
Issues - chromium - An open-source project to help move the web forward. - Monorail
143578 – Chrome: XMLHttpRequest executed in UIWebView encodes valid query string characters
iOS - Best Practices for Opening a Web Page Within an App - Outbrain Developer Center
How to transform xml with xslt and display it in Android webview
【讨论】: