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

Which authentication strategy should I use for my API?

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

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

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

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

  • 采用的解决方案是什么?


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

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

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

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