我应该为我的 API 使用哪种身份验证策略?
Posted
技术标签:
【中文标题】我应该为我的 API 使用哪种身份验证策略?【英文标题】:Which authentication strategy should I use for my API? 【发布时间】:2016-03-09 22:59:26 【问题描述】:我有一个客户端 angular-js 应用程序。我有一个服务器端 nodejs API。客户端和服务器端应用程序位于不同的域中。客户端使用 API 获取或发布一些数据。客户端也需要从服务器端获取图像并在浏览器中显示。
我使用护照 nodejs 模块进行身份验证。我不知道哪种身份验证策略更适合我。我认为有两种类型的身份验证策略:基于令牌和基于cookie。而且我认为这两种类型在我的情况下都没用:
如果我使用基于令牌的策略,那么我应该在每个请求中向 API 发送带有令牌的 Authentication 标头。我可以在 AJAX 请求中发送标头,但是如果我想显示位于服务器端的图像,我会遇到问题。因为浏览器不会在<img>
标记中发送标头。
如果我使用 cookie,那么我不会遇到图像问题。但我对 AJAX 请求有疑问。因为会话 cookie 存储在服务器端应用程序的域中。如果我从客户端域发送 AJAX 请求,那么我应该在每个请求中发送 cookie。我将 XmlHttpRequest 用于 AJAX,我应该使用 withCredentials 选项来发送 cookie。但是在跨域请求中,浏览器会在每个 AJAX 请求之前发送一个预检(OPTION)请求。并且浏览器不会发送带有 OPTION 请求的 cookie。这对我来说是个问题,因为如果未经授权,服务器端 API 无法对 OPTION 请求做出正确响应。
采用的解决方案是什么?
【问题讨论】:
【参考方案1】:了解 Web 应用程序和 Web 服务之间的区别很重要。 Web 应用程序提供标记、javascript、CSS 和图像文件,并且经常使用基于 cookie 的身份验证(但可以使用任何其他 implicit authentication 机制)。浏览器发出的任何请求都会自动进行身份验证。
另一方面,Web 服务通常使用不记名令牌身份验证。当浏览器、胖客户端或移动设备上的客户端与 API 通信时,它会在 HTTP 请求的 Authorization
标头中发送一个令牌。标头必须显式附加到执行 HTTP 请求的 JavaScript 或本机代码中的请求。
在单页应用程序 (SPA) 中,缺少 Web 应用程序,并且标记、JavaScript、CSS 和图像是从浏览器提供的,无需身份验证。仅对 Web 服务的请求进行身份验证,通常使用 JWT 令牌。
在您的情况下,如果您希望只有授权用户能够下载图像和其他文件,您应该考虑构建一个 Web 应用程序。使用像 OpenID Connect 这样的安全协议来验证您的用户。为您的 Web 应用程序选择支持 OpenID Connect 和为您的 Web 服务提供 OAuth2 的授权服务器。
【讨论】:
以上是关于我应该为我的 API 使用哪种身份验证策略?的主要内容,如果未能解决你的问题,请参考以下文章