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

标签 api authentication authorization passport.js

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

我使用 Passport nodejs 模块进行身份验证。我不知道哪种身份验证策略更适合我。我认为有两种类型的身份验证策略:基于 token 和基于cookie。而且我认为这两种类型在我的情况下都没用:

  • 如果我使用基于 token 的策略,那么我应该在每个请求中向 API 发送带有 token 的 Authentication header 。我可以在 AJAX 请求中发送 header ,但是如果我想显示位于服务器端的图像,我会遇到问题。因为浏览器不会在 <img> 中发送 header 标签。
  • 如果我使用 cookie,那么我不会遇到图像问题。但我对 AJAX 请求有疑问。因为 session cookie 存储在服务器端应用程序的域中。如果我从客户端域发送 AJAX 请求,那么我应该在每个请求中发送 cookie。我将 XmlHttpRequest 用于 AJAX,我应该使用 withCredentials发送 cookie 的选项。但是在跨域请求中,浏览器会在每个 AJAX 请求之前发送一个预检(OPTION)请求。并且浏览器不会发送带有 OPTION 请求的 cookie。这对我来说是个问题,因为如果未经授权,服务器端 API 无法对 OPTION 请求做出正确响应。

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

    最佳答案

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

    另一方面,Web 服务经常使用不记名 token 身份验证。当浏览器、胖客户端或移动设备中的客户端与 API 通信时,它会在 Authorization 中发送一个 token 。 HTTP 请求的 header 。 header 必须显式附加到执行 HTTP 请求的 JavaScript 或 native 代码中的请求。

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

    在您的情况下,如果您希望只有授权用户能够下载图像和其他文件,您应该考虑构建一个 Web 应用程序。使用像 OpenID Connect 这样的安全协议(protocol)对您的用户进行身份验证。选择同时支持您的 Web 应用程序的 OpenID Connect 和 OAuth2 的授权服务器为您的网络服务。

    关于api - 我应该为我的 API 使用哪种身份验证策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34098031/

    相关文章:

    android - 带有Youtube API的Android应用。在应用程序最小化或手机处于待机模式时运行音乐

    java - java 桌面中的 session

    java - @PreAuthorize ("isAuthenticated()") 与 http.anyRequest().authenticated()

    java - 如何使用 Jackson 编写嵌套 JSON?

    api - 在 magento 中使用 SOAP API 的 salesOrderInfo 获取简单的产品 sku 和 qty

    azure - Azure Function 如何针对 SignalR 进行身份验证?

    node.js - NodeJS - Passport-JWT,如何设置多个提取器?

    ruby-on-rails - 使用 Active Directory 进行 Rails 身份验证

    android - Android Webview客户端证书和Http授权

    java - 是否有任何简单的方法可以通过 API 了解 Salesforce 中的架构是否发生变化?