angular - Angular 的 Keycloak 不发送图像的不记名身份验证

标签 angular spring-mvc keycloak

我正在运行一个带有 的 Angular 应用程序。 Spring Boot MVC API 与 结合使用 key 斗篷 .我按照 https://www.npmjs.com/package/keycloak-angular 下的说明配置了 Angular。它通常工作正常。
在我的 Angular 组件中,我使用 img标记以包含由我的 Spring Boot 应用程序提供的图像

<img *ngIf="id" src="api/v1/profile/image/{{id}}">
MVC 端点如下所示:
@GetMapping(value = "profile/image/{id}")
    public @ResponseBody byte[] getProfileImage(@AuthenticationPrincipal Jwt jwt, @PathVariable String id)
            throws IOException {
            ...
            }
问题是 我在第一次加载图像时收到 401 响应代码。
以下是我的主要发现:
  • 图像的负载确实(从不)包含“授权:承载
    ...”请求 header (与请求相反,通过HttpClient )
  • 第一个失败的请求将有 set-cookie响应头
  • 连续请求将包含 cookie 作为一部分
    请求 header ,并且将工作

  • 谁能指出,我能做什么?可以以某种方式配置 keycloak,即图像的负载将包含不记名身份验证 header 吗?

    最佳答案

    <img *ngIf="id" src="api/v1/profile/image/{{id}}">
    
    这种图像是由浏览器加载的,而不是由 HttpClient 加载的。 .和HttpClient已配置为注入(inject) Authorization在您的情况下是 header ,而不是浏览器,因此这是问题的根本原因。
    您可以从 URL api/v1/profile/image/{{id}} 加载图像内容与 HttpClient然后使用 base64 编码将该图像内容内联到 HTML 中:
    <img src="data:<correct content type>;base64, <base 64 data of the image content>" />
    
    e.g.:
    <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUA
        AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
            9TXL0Y4OHwAAAABJRU5ErkJggg==" />
    
    这是小图像的好解决方案(这种方法通常用于社交图标)。
    或者,您可以在创建图像之前以与服务提供商所期望的格式相同的格式将授权保存到 cookie 中)。然后浏览器将在每个请求中发送该授权 cookie。当然,跨域 cookie 可能存在问题。

    关于angular - Angular 的 Keycloak 不发送图像的不记名身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63036442/

    相关文章:

    javascript - 如何通过 SSO 将 header 变量传递到我的 Angular 2 应用程序?

    javascript - 无法读取 null 的属性 'play'

    docker - Keycloak 8 : User with username 'admin' already added

    keycloak - 如何使用 Spring Cloud Gateway 和 Keycloak 验证 curl(或 Postman 或 Ajax)调用

    html - PrimeNG Accordion 展开全部/折叠全部

    angular - ngAfterViewInit() 和 ngAfterViewChecked() 有什么区别?

    java - 如何在 spring mvc 中提供静态内容?

    java - 在 SPRING MVC 中绑定(bind)嵌套对象

    java - 用于测试的 Spring Boot 设置安全性

    java - Keycloak:无法将 AnonymousAuthenticationToken 转换为 KeycloakAuthenticationToken