Java 使用<;img>;使用Spring security&;标记静止;JWT
当前情景 Spring项目使用Spring安全性和JWT保护restapi。这些API产生JSON响应。实现了一个Java 使用<;img>;使用Spring security&;标记静止;JWT,java,spring,rest,spring-security,oauth,Java,Spring,Rest,Spring Security,Oauth,当前情景 Spring项目使用Spring安全性和JWT保护restapi。这些API产生JSON响应。实现了一个UsernamePasswordAuthenticationFilter,用于验证在授权头中发送的JWT。经过身份验证和未经身份验证的API均按预期工作 要求 现在我需要在HTTP响应中为登录用户发送一个映像 解决方案1 发送一个字节[],将图像表示为“图像”键的值以及其他信息。 但是,如果图像很大,那么完整的JSON响应可能需要一些时间 解决方案2 将链接作为值与其他信息一起发送到
UsernamePasswordAuthenticationFilter
,用于验证在授权
头中发送的JWT。经过身份验证和未经身份验证的API均按预期工作
要求
现在我需要在HTTP响应中为登录用户发送一个映像
解决方案1
发送一个字节[]
,将图像表示为“图像”键的值以及其他信息。
但是,如果图像很大,那么完整的JSON响应可能需要一些时间
解决方案2
将链接作为值与其他信息一起发送到“image”键。客户端可以分配
,这将假定在单独的请求中获取大图像。然后使用@RequestMapping
创建一个请求,该请求对应于该链接,从而生成一个字节[]
我的问题
我更喜欢解决方案2。但由于没有有效的授权
令牌,它将产生未授权
异常。此外,此API必须经过身份验证
经过一些搜索,发现了,这是我的要求相同。公认的答案是
OAuth承载令牌规范支持将令牌作为查询参数发送
这是我必须做的吗?
- 在我的Spring过滤器中,从
头获取JWT(如果是) 空,从Authorization
request.getParameter()
- 在第一个的JSON响应中
API,发送
“图像”:http://ip/getImage?token=dbscsbCXV“
- 创建API
@GetMapping(“getImage”)字节[]getImage()
请指导我。如果您:
- 对服务器使用HTTPS,否则将公开请求头中的JWT令牌(授权头也是如此)
- 当令牌更改时,不要介意图像URL不再工作
另一种方法可能是生成具有足够熵的随机密钥(例如,将3个UUID组合成一个字符串),并将其与图像实体一起存储,从REST服务返回,例如:
https://ip/images/824b6854-edcc-11e6-bc64-92361f0026713567fef0-549a-4cdb-9264-5e15166dfd6f/the-file-name.pdf
确保禁用这些“公共”路径的Spring安全过滤器
这种方法的优点:
- 无需检查此资源的身份验证
- (如果图像没有太多变化)您可以将其缓存或通过CDN提供内容,而不必每次都为了流式图像而访问服务器
- URL将继续工作,即使用于身份验证的JWT令牌发生更改
您可能认为这不如使用每次呼叫身份验证安全,但如果ID具有足够的熵,它是防水的。Facebook也使用这个概念(,)谢谢@FrederikHeremans。将在尝试您的建议并参考链接后返回。