KeyCloak - Javascript 和 Spring 启动应用程序

Posted

技术标签:

【中文标题】KeyCloak - Javascript 和 Spring 启动应用程序【英文标题】:KeyCloak - Javascript & Spring boot application 【发布时间】:2015-08-01 08:56:24 【问题描述】:

我已经安装并配置了 keycloak 服务器。我的应用程序由部署在 apache HTTP 服务器上的单个 html 页面组成,该服务器与 keycloak 服务器位于同一台机器上。此 HTML 页面进行 REST json ajax 调用以获取数据。 HTML 页面使用 JS 适配器进行保护,其余服务使用 Spring Boot 应用程序公开并使用 Spring Boot 适配器进行保护。

Keycloak 有一个配置了客户端适配器的客户端。

现在,js 适配器完美运行文件。它重定向到登录页面,登录后,它重定向到所需的页面。 Spring Boot 适配器也可以正常工作。当我们为 Web 服务执行 GET 时,它会重定向到登录页面,并且在输入凭据后,Web 服务会提供响应。

问题是当 HTML 页面使用 AJAX 调用此 Web 服务时,它会失败。 因此,当我在密钥斗篷服务器中输入凭据并重定向到 html 页面时,html 页面无法进行 ajax 调用。 响应码为 302 并重定向到 keycloak auth 服务(在 ajax 调用期间)。

我的问题是: * 如果我的html页面和restful web服务使用相同的keycloak客户端,我不需要登录一次吗? * 如果(html 和 webservice )都被单独验证并且是工作文件,那么为什么当我只登录到 html 页面时它不工作? * 有没有其他方法可以解决这个问题?

【问题讨论】:

【参考方案1】:

解决方案非常简单。我不得不使用 jsonp 而不是 json ajax 请求。 我在 ajax 调用中添加了 dataType:"jsonp" 并使用 spring 4 建议来支持服务器端的 jsonp 支持。 建议代码:

@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice 
public JsonpAdvice() 
    super("callback");
    

javascript 代码:

$(document).ready(function() 
$.ajax(
    url: "http://localhost:8081/hello-world/",
    dataType:"jsonp"
).then(function(data) 
   $('.greeting-id').append(data.id);
   $('.greeting-content').append(data.content);
);

);

以下链接对我帮助很大:

Why is jquery's .ajax() method not sending my session cookie?

【讨论】:

以上是关于KeyCloak - Javascript 和 Spring 启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

keycloak javascript适配器请求离线令牌

keycloak 基于 JavaScript 的策略可以调用远程 REST API 吗?

Keycloak快速上手指南,只需10分钟即可接入Spring Boot/Vue前后端分离应用实现S

无法使用 Keycloak 评估基于 Javascript 的策略

带有令牌的Keycloak javascript适配器初始化不起作用?

Keycloak - 令牌过期后在 Ajax 调用中获取 401