我有一个客户端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通信时,它会Authorization
在HTTP请求的标头中发送令牌.标头必须显式附加到JavaScript中的请求或执行HTTP请求的本机代码中.
在单页应用程序(SPA)中,Web应用程序丢失,标记,JavaScript,CSS和图像从浏览器提供,无需身份验证.通常使用JWT令牌仅对对Web服务的请求进行身份验证.
在您的情况下,如果您只希望授权用户能够下载图像和其他文件,则应考虑构建Web应用程序.使用类似安全协议或OpenID Connect对用户进行身份验证.选择一个授权服务器,该服务器既支持Web应用程序的OpenID Connect,也支持Web服务的OAuth2.