针对Web应用和移动应用的REST API身份验证
我在决定如何为RESTful API实现身份验证方面遇到了一些麻烦,这些API可以安全地通过Web应用程序和移动应用程序使用。
首先,我想通过HTTPS调查HTTP基本认证作为一个选项。 这对于移动应用程序来说很好,因为用户名和密码可以安全地存储在操作系统钥匙串中,并且在传输过程中不会被拦截,因为请求将通过HTTPS进行。 它对API也很优雅,因为它将完全无状态。 这个问题是针对网络应用程序的。 没有权限访问这样的钥匙串来存储用户名和密码,所以我需要使用cookie或localStorage,但是我将用户的私人信息存储在易于访问的地方。
经过更多的研究,我发现了很多关于HMAC认证的讨论。 我用这种方法看到的问题是需要一个只有客户端和服务器知道的共享密钥。 除非我有一个需要用户名/密码并将秘密存回cookie的api /登录端点,否则如何才能在Web应用程序中将特定用户的每个用户的秘密获得? 用于未来的请求。 但是,这是向API介绍状态。
为了让另一个扳手进入工作中,我希望能够将API限制到某些应用程序(或者,为了能够阻止某些应用程序使用API)。 我看不到这是完全公开的Web应用程序。
我真的不想实施OAuth。 这可能是为了我的需要矫枉过正。
我觉得好像我可能不完全了解HMAC,所以我很乐意给出解释,并且我可以如何使用Web应用程序和移动应用程序安全地实现它。
更新
我最终使用HTTP基本身份验证,但不是提供每个请求的实际用户名和密码,而是实现一个端点来交换访问密钥的用户名和密码,然后为每个经过身份验证的请求提供访问密钥。 消除了在浏览器中存储用户名和密码的问题,但是当然,如果您有权访问机器并使用它,您仍然可以剔除令牌。 事后看来,我可能会进一步研究OAuth,但对初学者来说这非常复杂。
你应该使用OAuth2。 这里是:
1)移动应用程序
移动应用程序商店客户端凭据在您陈述自己。 然后它使用“资源所有者密码凭证授权”(请参阅http://tools.ietf.org/html/rfc6749#section-4.3)发送这些凭证。 反过来,它会得到一个(承载)令牌,它可以在以下请求中使用。
2)网站
该网站使用“授权代码授权”(见http://tools.ietf.org/html/rfc6749#section-4.1):
网站会在REST API中发现未经授权的请求并将浏览器重定向到支持HTML的自动化端点。
用户使用REST服务进行身份验证
REST网站使用URL中的访问令牌将用户重定向回网站。
网站调用REST站点并将访问令牌交换到授权令牌。
在网站使用授权令牌访问REST服务(代表最终用户)之后 - 通常通过在HTTP授权标头中将令牌包含为“承载”令牌。
这不是火箭科学,但需要一些时间才能完全理解。
3)限制某些应用程序的API访问
在OAuth2中,每个客户端都有一个客户端ID和客户端密钥(这里的“客户端”是您的移动应用程序或网站)。 客户端授权时必须发送这些凭证。 您的REST服务可以使用它来验证呼叫客户端
解决用户对API进行身份验证问题的一种方法是在用户登录时从API请求身份验证令牌。该令牌随后可用于后续请求。 你已经触及了这个方法 - 这听起来很不错。
关于限制某些网络应用程序。 您需要让每个Web应用程序标识每个请求,并在您的API实施中执行此认证。 非常直截了当。
我很容易和安全地为我自己的API解决了这个问题,而无需公开任何客户端证书。
我也将问题分成两部分。 API身份验证 - 这是来自已识别实体(网站或本机应用程序)的有效请求。 API授权,是允许使用此特定端点和HTTP动词的实体。
授权使用在API代码,配置和数据库中根据需要设置的访问控制列表和用户权限和设置编码到API中。 API中的简单if语句可以测试授权并返回适当的响应(未授权或处理API调用的结果)。
身份验证现在只是检查是否是真的。 为此,我向客户发出自签名证书。 对API的调用是在他们想要的时候通过服务器完成的 - 通常是在他们生成第一个页面时(或者他们正在执行他们自己的应用程序登录检查时)。 此呼叫使用我以前提供的证书。 如果在我身边,我很高兴证书是有效的,我可以返回一个随机数和一个时间限制的API密钥。 此密钥用于其他API端点的所有后续调用,例如在承载标头中,并且它可以非常公开地存储在HTML表单字段或JavaScript变量或应用程序中的变量中。
随机数将防止重放攻击,并且如果有人需要,API密钥可能会被盗用 - 它们在到期之后将不能继续使用,或者在下一次调用之前临时数更改。
每个API响应将包含下一个随机数,如果随机数不匹配,它将返回认证错误。 事实上nonce不匹配我也杀了API密钥。 这将迫使真正的API用户使用证书重新进行身份验证。
只要最终用户保持这些证书的安全,并且不公开他们用于进行初始身份验证调用的方法(例如使其成为可以重播的ajax请求),那么API就非常好且安全。
链接地址: http://www.djcxy.com/p/22051.html上一篇: REST API authentication for web app and mobile app
下一篇: Basic Authentication with a Guid token for REST api instead of username/password