如果我使用基于令牌的身份验证,我应该如何加载图像

Ild*_*dar 20 authentication api ajax

我在域上有一个客户端应用程序,在域上client-domain.com有一个服务器端应用程序server-domain.com.服务器端有一个API.客户端应用程序将AJAX请求发送到服务器端应用程序.我使用基于令牌的身份验证,因此客户端应用程序在每个AJAX请求的头文件中发送令牌,例如:"授权:承载{某些令牌}".当我需要获取或发布一些数据时,它可以很好地处理AJAX请求.

但服务器端API也保留文件.例如图像.文件是私有的,只有经过身份验证的用户才能获取它们.我需要在<img>标签的客户端显示这些图像.我无法使用它们,<img src="http://server-domain.com/path/to/image">因为在这种情况下,浏览器不会向服务器端发送Authorization标头.

采用的解决方案是什么?客户端应用程序如何从服务器端API加载图像?

Jef*_*rio 12

有三种解决方法,最好的解决方法是使用签名的URL


  1. 第一种方法只是使用签名哈希参数创建一个无需身份验证(匿名访问)的路由,该哈希参数指示是否可以加载资源。
<img src="http://server-domain.com/path/to/image?guid=f6fc84c9f21c24907d6bee6eec38cabab5fa9a7be8c4a7827fe9e56f2">
Run Code Online (Sandbox Code Playgroud)

服务器收到请求后,如果尚未达到到期时间,则必须验证guid,当然,请检查guid是否为有效签名。

多个文件/文档服务器(例如Dropbox,S3,CDN提供程序等)使用此方法。

在某些公司中查看该技术。


  1. 第二种方法是通过带有图像URL的querystring传递令牌。

    • 建议不要使用此方法,因为要清楚公开URL,并且许多服务器有时会编写和公开所访问URL的公共日志。不幸的是,JWT通常向用户公开,用户可以进一步控制许多功能来进一步加载图像。
<img src="http://server-domain.com/path/to/image?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c">
Run Code Online (Sandbox Code Playgroud)

服务器收到请求后,必须通过querystring验证令牌,并使用内容进行响应。


  1. 第三种方法创建一个经过身份验证的cookie来验证图像的访问。

    • 不建议使用此方法,因为该方法超出了API模式(通常基于Webapi /令牌的身份验证)。

服务器收到请求后,您需要验证验证cookie是否有效。

  • 您能解释一下为什么选项2不能抵御XSS,大概是为什么选项1可以抵御XSS吗?在选项1中,我们如何生成和验证GUID? (2认同)
  • @JefersonTenorio,那么,在第一种情况下,任何(经过身份验证/未经身份验证的)用户都可以在guid有效的情况下访问资源?有第一种方法的示例实现吗?我查看了这些链接,但是它们似乎非常针对他们所谈论的生态系统。 (2认同)