我们计划使用keycloak来保护一堆Web应用程序,其中一些是用Java编写的,有些是用JavaScript(带有React)的。
通过keycloak登录用户之后,每个Web应用程序都需要检索已登录的用户以及该用户具有的领域/客户端角色。
(request -> KeycloakSecurityContext -> getIdToken -> getPreferredUsername/getOtherClaims)。他们似乎工作正常对于JavaScript应用程序,我们尝试了以下代码,但无法成功使Keycloak初始化(请注意,在用户已经通过keycloak进行身份验证之后,此代码位于Web应用程序代码中,该应用程序仅尝试检索以哪些角色登录的用户):
var kc = Keycloak({
url: 'https://135.112.123.194:8666/auth',
realm: 'oneRealm',
clientId: 'main'
});
//this does not work as it can't find the keycloak.json file under WEB-INF
//var kc = Keycloak('./keycloak.json');
kc.init().success(function () {
console.log("kc.idToken.preferred_username: " + kc.idToken.preferred_username);
alert(JSON.stringify(kc.tokenParsed));
var authenticatedUser = kc.idTokenParsed.name;
console.log(authenticatedUser);
}).error(function () {
window.location.reload();
});
Run Code Online (Sandbox Code Playgroud)我认为Web应用程序需要检索当前的用户信息是相当普遍的。谁知道上面的代码为什么不起作用?
谢谢。
我不知道如何用CXF 3.0.4 JAX-RS 2.0客户端以编程方式禁用CN检查.我的代码如下:
System.setProperty("jsse.enableSNIExtension", "false");
HttpsURLConnection.setDefaultHostnameVerifier(
new HostnameVerifier(){
public boolean verify(String hostname,
SSLSession sslSession) {
return true;
}
});
Client client = ClientBuilderImpl.newClient();
String urlHost = "https://" + centralNode;
WebTarget target = client.target(urlHost).path(BASE_SERVICE_URL);
String encodedpw = Base64.encodeBase64String(passwd.getBytes());
String body = "{\"uid\" : \"" + uid + "\",\"password\": \"" + encodedpw + "\"}";
Response res = target.request(MediaType.APPLICATION_JSON).post(Entity.entity(body, MediaType.APPLICATION_JSON)); Run Code Online (Sandbox Code Playgroud)
如您所见,我已经尝试覆盖默认的hostnameverifier,并将jsse.enableSNIExtension设置为false.这些都不起作用,我仍然得到例外:
"https URL主机名与客户端信任库中服务器证书上的公用名(CN)不匹配.确保服务器证书正确,或禁用此检查(不建议用于生产)设置CXF客户端TLS配置属性"disableCNCheck "为了真实."
请帮忙!