Java 使用<;img>;使用Spring security&;标记静止;JWT

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 将链接作为值与其他信息一起发送到

当前情景

Spring项目使用Spring安全性和JWT保护restapi。这些API产生JSON响应。实现了一个
UsernamePasswordAuthenticationFilter
,用于验证在
授权
头中发送的JWT。经过身份验证和未经身份验证的API均按预期工作

要求

现在我需要在HTTP响应中为登录用户发送一个映像

解决方案1

发送一个
字节[]
,将图像表示为“图像”键的值以及其他信息。 但是,如果图像很大,那么完整的JSON响应可能需要一些时间

解决方案2

将链接作为值与其他信息一起发送到“image”键。客户端可以分配
,这将假定在单独的请求中获取大图像。然后使用
@RequestMapping
创建一个请求,该请求对应于该链接,从而生成一个
字节[]

我的问题

我更喜欢解决方案2。但由于没有有效的
授权
令牌,它将产生
未授权
异常。此外,此API必须经过身份验证

经过一些搜索,发现了,这是我的要求相同。公认的答案是

OAuth承载令牌规范支持将令牌作为查询参数发送

这是我必须做的吗?

  • 在我的Spring过滤器中,从
    Authorization
    头获取JWT(如果是) 空,从
    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。将在尝试您的建议并参考链接后返回。