当前位置: 首页 > 知识库问答 >
问题:

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

彭正谊
2023-03-14

我在域< code > client-domain . example 上有一个客户端应用程序,在域< code > server-domain . example 上有一个服务器端应用程序。服务器端有一个API。客户端应用程序向服务器端应用程序发送AJAX请求。我使用基于令牌的认证,所以客户端应用程序在每个AJAX请求的头中发送令牌,例如:“Authorization:Bearer { some token }”。当我需要获取或发布一些数据时,它可以很好地处理AJAX请求。

但是服务器端API也保留文件。例如图像。这些文件是私有的,只有经过身份验证的用户才能获取它们。我需要在中的客户端显示这些图像

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


共有2个答案

谷梁翰飞
2023-03-14

我对这个完全相同的问题的解决方案基本上是基于下面Jeferson Tyorio的回答(选项1),是通过对图像和用户的JWT令牌进行加密来签署我的API调用的URL,例如路径/到/图像?令牌=xxxx。在laravel中,这很容易通过加密($your_object)解密($令牌)(https://laravel.com/docs/5.7/encryption)来完成,然后我使用提取的令牌来验证用户是否可以访问相关文件。但是可能有许多其他库能够处理这个问题。

东门翰
2023-03-14
匿名用户

有三种方法可以解决这个问题,最好的方法是使用带签名的URL

第一种方法简单地创建一个没有身份验证(匿名访问)的路由,该路由带有一个签名哈希参数,该参数指示是否可以加载资源。

<img src="http://server-domain.example/path/to/image?guid=f6fc84c9f21c24907d6bee6eec38cabab5fa9a7be8c4a7827fe9e56f2">

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

Dropbox、S3、CDN提供商等多个文件/文档服务器都使用这种方法。

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

> < Li > < p > https://docs . AWS . Amazon . com/Amazon cloud front/latest/developer guide/private-content-signed-URLs . html # private-content-overview-chopping-duration

<代码>https://client.cdn77.example/support/knowledgebase/cdn-resource/how-do-i-set-up-signed-urls

安全性:

    < Li > < code > guid 不能只是映像/用户的UUID,因为这不提供任何保护。 < Li > < code > guid 不能与您用于身份验证的令牌相同(例如,您不能使用auth-JWT令牌),因为用户可以共享链接,并且用户将共享其令牌(另请参见(2))。

如上所述:<code>guid</code>应该具有服务器端验证机制(日期/签名/…),并且不应该提供比“访问请求的文件”更多的权限

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

  • 不建议使用此方法,因为它清楚地公开了 URL,并且许多服务器有时会写入和公开所访问 URL 的公共日志。不好的通知是,正常暴露的JWT用户可以控制许多功能进一步的图像加载。
<img src="http://server-domain.example/path/to/image?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c">

当服务器收到请求时,您必须通过查询字符串验证令牌并使用内容进行响应。

安全说明:比 (1) 更糟糕 - 因为现在身份验证信息(JWT 身份验证)暴露在 URL 中,可以由服务器缓存/记录或由中间的任何服务器访问,或者用户可以简单地与同事共享“图像链接”。

但是,如果 JWT 不是访问令牌,而是专门为以 JWT 形式访问该特定文件而生成的一次性令牌,则它提供与 (1) 相同的安全级别。

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

  • 不推荐此方法,因为它超出了API模式(一般基于webapi/令牌的身份验证)。

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

安全注意事项:如果您可以为您的Cookie和XSS以及CSRF提供安全保护,那么这就不是一个解决方案。但请记住:cookies是由浏览器在每次请求时自动发送的。关于可能的威胁和解决方案的更多信息:在浏览器中存储JWT的位置?如何防范CSRF?

 类似资料:
  • 问题内容: 我有一个REST API,我正在使用Spring Security基本授权进行身份验证,客户端会为每个请求发送用户名和密码。现在,我想实现基于令牌的身份验证,当用户最初通过身份验证时,我将在响应标头中发送令牌。对于进一步的请求,客户端可以在令牌中包含该令牌,该令牌将用于对资源进行用户身份验证。我有两个身份验证提供程序tokenAuthenticationProvider和daoAuth

  • 在daoAuthenticationProvider中,我设置了自定义userDetailsService并通过从数据库中获取用户登录详细信息对其进行身份验证(只要使用授权传递用户名和密码就可以正常工作:basic bgllqxbpvxnlcjogn21wxidmqjrdturtr04pag==作为头) 但是当我使用X-AUTH-TOKEN(即constants.auth_header_name)

  • null 我的自定义rest筛选器: 上面的内容实际上会导致应用程序启动时出现一个错误:有人能告诉我如何最好地执行此操作吗?pre_auth筛选器是执行此操作的最好方法吗? 编辑 使用Spring-security实现解决方案 希望它能帮助其他人…

  • 问题内容: 在我的Java EE6 REST服务上,我想使用身份验证令牌从移动设备登录,用户将发送其用户名,密码,服务器将发回令牌,该令牌将用于授权用户对给定的进一步请求时间。 我可以这样简单地自己创建令牌吗?(我想我不需要加密此令牌,因为我将使用HTTPS。) 还是有一种更标准的方式来创建我的令牌?也许它存在于API之一 问题答案: 您有效地提出的方案允许客户端无限制地访问您的服务。初始登录后,

  • 问题内容: 我正在PHP Lumen中构建一个应用程序,该应用程序在登录时会返回令牌。我不知道如何继续进行。 我应该如何使用这些令牌维护会话? 具体来说,如果我使用reactjs或原始HTML / CSS / jQuery,如何将令牌存储在客户端,并在我为Web应用程序的安全部分提出的每个请求中发送令牌? 问题答案: 我通常要做的是将令牌保留在本地存储中,这样即使用户离开站点,我也可以保留令牌。

  • 我读了一些关于“JWT vs Cookie”的帖子,但它们只会让我更加困惑…… > 我想澄清一下,当人们谈论“基于令牌的身份验证与cookie”时,这里的cookie仅指会话cookie?我的理解是,cookie就像一个介质,它可以用来实现基于令牌的身份验证(在客户端存储可以识别登录用户的东西)或者基于会话的身份验证(在客户端存储与服务器端会话信息匹配的常量) 为什么我们需要JSON web令牌?