我在域< code > client-domain . example 上有一个客户端应用程序,在域< code > server-domain . example 上有一个服务器端应用程序。服务器端有一个API。客户端应用程序向服务器端应用程序发送AJAX请求。我使用基于令牌的认证,所以客户端应用程序在每个AJAX请求的头中发送令牌,例如:“Authorization:Bearer { some token }”。当我需要获取或发布一些数据时,它可以很好地处理AJAX请求。
但是服务器端API也保留文件。例如图像。这些文件是私有的,只有经过身份验证的用户才能获取它们。我需要在中的客户端显示这些图像
采用的解决方案是什么?客户端应用程序如何从服务器端API加载图像?
我对这个完全相同的问题的解决方案基本上是基于下面Jeferson Tyorio的回答(选项1),是通过对图像和用户的JWT令牌进行加密来签署我的API调用的URL,例如路径/到/图像?令牌=xxxx
。在laravel中,这很容易通过加密($your_object)
和解密($令牌)
(https://laravel.com/docs/5.7/encryption)来完成,然后我使用提取的令牌来验证用户是否可以访问相关文件。但是可能有许多其他库能够处理这个问题。
有三种方法可以解决这个问题,最好的方法是使用带签名的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
安全性:
如上所述:<code>guid</code>应该具有服务器端验证机制(日期/签名/…),并且不应该提供比“访问请求的文件”更多的权限
第二种方法是通过带有图像URL的querystring传递令牌。
<img src="http://server-domain.example/path/to/image?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c">
当服务器收到请求时,您必须通过查询字符串验证令牌并使用内容进行响应。
安全说明:比 (1) 更糟糕 - 因为现在身份验证信息(JWT 身份验证)暴露在 URL 中,可以由服务器缓存/记录或由中间的任何服务器访问,或者用户可以简单地与同事共享“图像链接”。
但是,如果 JWT 不是访问令牌,而是专门为以 JWT 形式访问该特定文件而生成的一次性令牌,则它提供与 (1) 相同的安全级别。
第三种方法创建一个经过身份验证的cookie来验证图像的访问。
当服务器收到请求时,您需要验证验证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令牌?