是否可以识别(验证)移动应用程序 HTTP 请求?例如,来自网络服务器的请求可以通过域或 IP 来识别,假设我知道它应该来自哪里,我可以接受请求,如果它来自意外的来源,则可以拒绝。
doe 的移动应用程序有某种独特的 id(无法模仿)?
是否可以识别(验证)移动应用程序 HTTP 请求?例如,来自网络服务器的请求可以通过域或 IP 来识别,假设我知道它应该来自哪里,我可以接受请求,如果它来自意外的来源,则可以拒绝。
doe 的移动应用程序有某种独特的 id(无法模仿)?
如果您需要从移动应用程序(本机编译的应用程序)进行安全的 HTTP 调用(webservice API),您可以尝试以下方法:
编辑:这种方法假设您不能依赖用户操作应用程序来进行身份验证(因为您可以简单地要求用户在应用程序中输入安全密码)。
假设您正在实现应用程序,请在代码中保存某种 API 密钥。
当应用程序通过 HTTP 进行 API 调用时,它将始终使用 HTTPS 完成(因此所有内容都是加密的)。
应用程序将 API 密钥作为 URL 参数发送。
服务器将通过检查密钥是否正确来进行身份验证。
嗅探应用程序流量不会泄露密钥(因为 HTTPS)。
您最容易受到有人对您的应用程序进行逆向工程以发现其中的密钥。这可以通过使用各种混淆和反调试技术变得困难,但不能做到真正不可能。只要您使用的是编译语言(例如 Objective-C,而不是用于 Web 应用的 JS),如果没有任何特殊的游戏,这已经很困难了。如果您避免按原样放置 API 密钥字符串并在应用程序中使用一些短代码来计算它,那么您发现它的难度增加了大约 1000 倍。
在不了解您的具体问题的情况下,很难提出替代方法。如果您正在寻找不同的东西,请提供更多详细信息。
实际使用的方法有两种。HTTP 基本身份验证(对于移动应用程序不太安全)和 OAuth2(与 HTTP 基本身份验证相比更安全)。
开发人员会获得一个 API 密钥(通常是 ID 和 Secret)。此 API 密钥通常如下所示:3bb743bbd45d4eb8ae31e16b9f83c9ba:ffb7d6369eb84580ad2e52ca3fc06c9d。
他负责将 API 密钥存储在其服务器上的安全位置,以便任何人都无法访问它。他通过在 HTTP Authorization 标头中提供 API 密钥以及单词“Basic”(API 服务器使用它来正确解码授权凭证)向 API 服务发出 API 请求。密钥也是 Base64 编码的。
例如键可以是:3bb743bbd45d4eb8ae31e16b9f83c9ba:ffb7d6369eb84580ad2e52ca3fc06c9d
以 base64 编码:M2JiNzQzYmJkNDVkNGViOGFlMzFlMTZiOWY4M2M5YmE6ZmZiN2Q2MzY5ZWI4NDU4MGFkMmU1MmNhM2ZjMDZjOWQ=。
API 服务器反转此过程。当它找到 HTTP Authorization 标头时,它将解码 base64 结果,读取 API 密钥 ID 和 Secret,并在允许处理请求之前验证这些令牌。
HTTP 基本身份验证很简单,但对于移动应用程序来说,保护 API 密钥是一个主要问题。HTTP 基本身份验证需要通过网络为每个请求发送原始 API 密钥,从而增加了长期滥用的机会。这也是不切实际的,因为您不能安全地将 API 密钥嵌入到分发给许多用户的移动应用程序中。
例如,如果您构建了一个嵌入了 API 密钥的移动应用程序,那么用户可能会对您的应用程序进行反向工程,从而暴露此 API 密钥并滥用您的服务。
因此 HTTP 基本身份验证在开放环境中存在风险,例如 Web 浏览器和移动应用程序。
注意:与所有身份验证协议一样,HTTP 基本身份验证必须始终通过 SSL 使用。
移动 API 安全的 OAuth2:
OAuth2 是一种出色的协议,用于保护开放设备中的 API 服务,并提供了一种通过令牌身份验证对移动用户进行身份验证的更好方法。
OAuth2 令牌身份验证从用户角度工作(OAuth2 将其命名为密码授予流程):
当用户启动移动应用程序时,系统会提示他输入用户名或电子邮件和密码。开发人员将包含登录数据的 POST 请求从应用程序发送到 API 服务(通过 SSL)。然后验证用户凭据,并为在一定时间后过期的用户创建访问令牌。此访问令牌可以存储在移动设备上,将其视为允许访问 API 服务的 API 密钥。当访问令牌过期时,再次提示用户输入登录详细信息。
OAuth2 生成的访问令牌可以临时存储在开放环境中并且是安全的。它是安全的,因为访问令牌是为临时目的而生成的,它减少了潜在的损坏。
令牌根据使用的移动平台进行存储。对于 Android 应用,访问令牌可以存储在 Shared Preferences 中,对于 iOS 应用,可以存储在 Keychain 中。
这取决于您如何定义“移动应用程序”。在移动设备上运行的任何应用程序?在移动设备上运行网页浏览?对你来说什么是移动设备?
无论如何,一般简短的回答是,您可以使用在 HTTP 标头中发送的 User-Agent 检测设备类型。所有流行的移动浏览器都会发送这个。但请注意,这:
我不知道有更可靠的方法来做到这一点。并且只要事情发生在 HTTP 上,通常就没有任何方法可以肯定地了解客户端的任何信息。对于大多数用例,您可以查看 User-Agent。
您可以购买对包含各种设备数据的用户代理数据库的访问权,如果适用,其中两个是WURFL或DeviceAtlas。