我在决定如何为一个RESTful API实现认证,以便于网络应用和移动应用都能够安全地使用时遇到了一些问题。
首先,我考虑使用HTTP基本身份验证加上HTTPS。对于移动应用程序来说,这将非常有效,因为用户名和密码可以安全地存储在OS密钥链中,并且由于请求是通过HTTPS完成的,所以不能被拦截。对于API来说,它完全是无状态的,也很优雅。但是对于网络应用程序来说,没有访问这样的密钥链来存储用户名和密码,所以我需要使用cookie或localStorage,但这将把用户的私人信息存储在一个容易访问的地方。
经过更多的研究,我发现了很多关于HMAC认证的讨论。我看到的问题是需要有一个共享的秘密,只有客户端和服务器知道。我如何将此用户特定的秘密传递给网络应用程序中的特定用户,除非我有一个接受用户名/密码并返回密钥以存储在cookie中的api/login端点,以供未来请求使用。但是这会向API引入状态。
为了将局面变得更加复杂,我想能够限制API仅允许特定的应用程序(或者能够阻止某些应用程序使用API)。我无法看到如何在网络应用程序完全公开的情况下实现这一点。
我真的不想使用OAuth。这可能超出了我的需求范围。
我感觉自己可能没有完全理解HMAC,因此我欢迎一个解释,并了解如何使用它来为网络应用和移动应用提供安全性。
更新:
最终我使用了HTTP基本身份验证,但是不是每次请求提供实际的用户名和密码,而是实现了一个端点以交换用户名和密码获取访问密钥,然后为每个经过身份验证的请求提供该密钥。这消除了在浏览器中存储用户名和密码的问题,当然,如果有人能够访问机器并使用它,仍然可以窃取令牌。回顾一下,我可能会进一步研究OAuth,但对于初学者来说,它非常复杂。
首先,我考虑使用HTTP基本身份验证加上HTTPS。对于移动应用程序来说,这将非常有效,因为用户名和密码可以安全地存储在OS密钥链中,并且由于请求是通过HTTPS完成的,所以不能被拦截。对于API来说,它完全是无状态的,也很优雅。但是对于网络应用程序来说,没有访问这样的密钥链来存储用户名和密码,所以我需要使用cookie或localStorage,但这将把用户的私人信息存储在一个容易访问的地方。
经过更多的研究,我发现了很多关于HMAC认证的讨论。我看到的问题是需要有一个共享的秘密,只有客户端和服务器知道。我如何将此用户特定的秘密传递给网络应用程序中的特定用户,除非我有一个接受用户名/密码并返回密钥以存储在cookie中的api/login端点,以供未来请求使用。但是这会向API引入状态。
为了将局面变得更加复杂,我想能够限制API仅允许特定的应用程序(或者能够阻止某些应用程序使用API)。我无法看到如何在网络应用程序完全公开的情况下实现这一点。
我真的不想使用OAuth。这可能超出了我的需求范围。
我感觉自己可能没有完全理解HMAC,因此我欢迎一个解释,并了解如何使用它来为网络应用和移动应用提供安全性。
更新:
最终我使用了HTTP基本身份验证,但是不是每次请求提供实际的用户名和密码,而是实现了一个端点以交换用户名和密码获取访问密钥,然后为每个经过身份验证的请求提供该密钥。这消除了在浏览器中存储用户名和密码的问题,当然,如果有人能够访问机器并使用它,仍然可以窃取令牌。回顾一下,我可能会进一步研究OAuth,但对于初学者来说,它非常复杂。