我正在构建一个REST API作为移动应用程序的后端。我想检查对API的请求是否来自我们的移动应用。但是,API将要求最终用户登录才能访问某些端点。
我的问题是,我该如何对所有传入请求进行身份验证以确保它们来自我们自己的应用程序,同时还要对某些请求的最终用户进行身份验证?
我当时正在考虑在身份验证HTTP标头中发送带有所有请求的API密钥以认证移动应用程序,并且(用逗号分隔)还沿着JWT发送以认证最终用户。尽管这可能有效,但似乎有些“ hacky”。
同时验证移动应用和身份验证的标准方法是什么 移动应用的最终用户?
答案 0 :(得分:1)
使用应用程序令牌和用户特定的会话令牌是分离两者身份验证的一种方法。应用程序令牌对于您的应用程序将是唯一的,并且应进行模糊处理,以便检查客户端的二进制文件不会导致对令牌的轻松检测。用户特定的会话令牌应在用户登录时生成。客户端将此用户会话密钥添加到以后的API调用中,服务器将检查该会话密钥是否有效,并可以使用它来查找存储的任何会话状态为客户。
但是,最佳地,您将实现完整的oauth2规范。如本ultimate guide to mobile API security所述:
从用户角度讲,这是OAuth2令牌认证的工作方式 (OAuth2将此称为密码授予流程):
用户打开您的移动应用程序,并提示您输入用户名或电子邮件和密码。
您从移动应用向您的API服务发送了POST请求,其中包含用户的用户名或电子邮件和密码数据(通过SSL!)。
您验证用户凭据,并为该用户创建访问令牌,该令牌在一定时间后到期。
您将此访问令牌存储在移动设备上,将其视为可以访问API服务的API密钥。
一旦访问令牌过期并且不再可用,您将再次提示用户输入用户名或电子邮件和密码。
OAuth2之所以非常适合保护API,是因为它不需要您在不安全的环境中存储API密钥。相反,它将生成可暂时存储在不受信任的环境中的访问令牌。
这很棒,因为即使攻击者设法以某种方式设法控制了您的临时访问令牌,该令牌也会过期!这样可以减少潜在的损害(我们将在下一篇文章中更深入地介绍这一点。)