我应该为我的API使用哪种身份验证策略?

时间:2015-12-04 21:47:56

标签: api authentication authorization passport.js

我有一个客户端angular-js应用程序。我有一个服务器端nodejs API。客户端和服务器端应用程序位于不同的域上。客户端使用API​​来获取或发布一些数据。客户端也需要从服务器端获取图像并在浏览器中显示它们。

我使用passport nodejs模块进行身份验证。我不知道哪种身份验证策略对我更好。我认为有两种类型的身份验证策略:基于令牌和基于cookie。我认为在我的情况下这两种类型都没用:

  1. 如果我使用基于令牌的策略,那么我应该在每个请求中向API发送带有令牌的Authentication头。我可以在AJAX请求中发送标头,但如果我想显示位于服务器端的图像,我就有问题了。因为浏览器不会在<img>标记中发送标头。

  2. 如果我使用cookies,那么我就不会遇到图像问题。但是我遇到了AJAX请求的问题。因为会话cookie存储在服务器端应用程序的域中。如果我从客户端域发送AJAX请求,那么我应该发送每个请求的cookie。我使用XmlHttpRequest进行AJAX,我应该使用withCredentials选项来发送cookie。但在跨域请求中,浏览器将在每个AJAX请求之前发送预检(OPTION)请求。浏览器不会发送带有OPTION请求的cookie。这对我来说是一个问题,因为如果没有授权,服务器端API无法对OPTION请求做出正确的响应。

  3. 采用的解决方案是什么?

1 个答案:

答案 0 :(得分:6)

了解Web应用程序和Web服务之间的区别非常重要。 Web应用程序提供标记,JavaScript,CSS和图像文件,并且通常使用基于cookie的身份验证(但可以使用任何其他implicit authentication机制)。浏览器发出的任何请求都会自动进行身份验证。

另一方面,Web服务通常使用承载令牌认证。当浏览器,胖客户端或移动设备上的客户端与API通信时,它会沿着HTTP请求的Authorization标头中的令牌发送。标头必须显式附加到JavaScript中的请求或执行HTTP请求的本机代码。

在单页应用程序(SPA)中,缺少Web应用程序,并且无需身份验证即可从浏览器提供标记,JavaScript,CSS和图像。仅通过使用JWT令牌对Web服务的请求进行身份验证。

在您的情况下,如果您只希望授权用户能够下载图像和其他文件,则应考虑构建Web应用程序。使用类似或OpenID Connect的安全协议对用户进行身份验证。选择一个授权服务器,该服务器既支持Web应用程序的OpenID Connect,也支持Web服务的OAuth2