- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须使用使用 Keycloak 保护的应用程序的 REST API,该应用程序充当 OAUTH2-Provider 的代理。
为此,我使用 OAuth2RestTemplate 和 ResourceOwnerPasswordDetails。我可以毫无问题地从第三方提供商处获取访问 token ,但如何进一步使用它,这是问题。在 header 中将其用作承载者没有帮助。
有什么建议吗?
OAuthConfig.java
@Bean
public ResourceOwnerPasswordResourceDetails resource(){
ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();
resource.setClientAuthenticationScheme(AuthenticationScheme.form);
resource.setAccessTokenUri(env.getProperty("access.token.uri"));
resource.setClientId(env.getProperty("access.client.id"));
resource.setGrantType("password");
resource.setClientSecret(env.getProperty("access.client.secret"));
resource.setUsername(env.getProperty("access.client.username"));
resource.setPassword(env.getProperty("access.client.password"));
resource.setScope(Arrays.asList(env.getProperty("access.client.scope")));
return resource;
}
获取访问 token 的服务
@Autowired
private OAuthConfig authConfig;
@Override
public OAuth2AccessToken getAccessToken(){
ResourceOwnerPasswordAccessTokenProvider provider = new ResourceOwnerPasswordAccessTokenProvider();
OAuth2AccessToken accessToken = provider.obtainAccessToken(authConfig.resource(), new DefaultAccessTokenRequest());
return accessToken;
}
OAuth2RestTemplate
@Autowired private ProdAuthService authService;
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(authConfig.resource(), new DefaultOAuth2ClientContext(authService.getAccessToken()));
restTemplate.setRequestFactory(requestFactory);
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);
header.set("Authorization", "Bearer " + authService.getAccessToken());
HttpEntity<String> request = new HttpEntity<String>(header);
ResponseEntity <ProcessInstanceLogWrapper> response = restTemplate.exchange(uri, HttpMethod.GET, request, new ParameterizedTypeReference<ProcessInstanceLogWrapper>(){});
ProcessInstanceLogWrapper json = response.getBody();
我收到的错误
Caused by: org.springframework.security.oauth2.client.http.AccessTokenRequiredException: OAuth2 access denied.
在Keycloak中,我们还使用Authorizaion URL,但似乎不可能将其与ResourceOwnerPasswordResourceDetails一起使用。根据我的看法,也可能是这样,这是行不通的。
最佳答案
RestTemplate 创建:
protected RestKeyCloakClient()
{
MultiValueMap<String, String> header = new LinkedMultiValueMap<String, String>();
OAuth2RestTemplate client;
DefaultAccessTokenRequest accessTokenRequest = new DefaultAccessTokenRequest();
DefaultOAuth2ClientContext context = new DefaultOAuth2ClientContext(accessTokenRequest);
OAuth2AccessTokenSupport support = new OAuth2AccessTokenSupport()
{
};
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new FormOAuth2AccessTokenMessageConverter());
messageConverters.add(new FormOAuth2ExceptionHttpMessageConverter());
MappingJackson2HttpMessageConverter jackson = new MappingJackson2HttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(new MediaType("application", "x-www-form-urlencoded"));
jackson.setSupportedMediaTypes(mediaTypes);
messageConverters.add(jackson);
support.setMessageConverters(messageConverters);
client = new OAuth2RestTemplate(getAuthDetails(null, null), context);
client.setErrorHandler(errorHandler);
client.setRequestFactory(factory);
token = client.getAccessToken();
}
资源所有者密码资源详细信息:
private ResourceOwnerPasswordResourceDetails getAuthDetails(String userName, String userPwd)
{
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager()
{
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers()
{
return null;
}
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
{
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
{
}
}};
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
}
ResourceOwnerPasswordResourceDetails authDetails = new ResourceOwnerPasswordResourceDetails();
authDetails.setAccessTokenUri(LoggerAndReader.getInstance().getoAuth2tokenRequestUrl());
authDetails.setClientId(LoggerAndReader.getInstance().getoAuth2ClientId());
authDetails.setClientSecret(LoggerAndReader.getInstance().getoAuth2SecretToken());
authDetails.setGrantType(LoggerAndReader.getInstance().getOauth2granttype());
if (StringUtils.isNotBlank(userName) && StringUtils.isNotBlank(userPwd)) {
authDetails.setUsername(userName);
authDetails.setPassword(userPwd);
} else {
authDetails.setUsername(LoggerAndReader.getInstance().getOauth2UserName());
authDetails.setPassword(LoggerAndReader.getInstance().getOauth2password());
}
// authDetails.setScope(Arrays.asList(new String[] {"cn mail sn givenname uid employeeNumber"}));
return authDetails;
}
执行和进一步使用:
public ResponseEntity<String> execute(String url, HttpMethod httpMethod, Object o)
{
HttpEntity request = new HttpEntity(o, this.header);
ResponseEntity<String> resp = null;
this.header.set("Authorization", token.getTokenType() + " " + token.getValue());
try {
resp = this.client.exchange(url, httpMethod, request, String.class);
} catch (Exception e) {
String str = getStackTrace(e);
if (StringUtils.containsIgnoreCase(str, "SocketTimeoutException")) {
throw new KeycloakHTTPClientSocketException(
"Got a SocketTimeoutException for URL:" + url + ", HTTPMethod:" + httpMethod);
} else
throw new Exception(...);
}
return resp;
}
要添加更多 header ,您需要添加它们:
public void setThisHeaderValue(String key, String value)
{
this.header.add(key, value);
}
关于java - 使用 Keycloak 保护的 REST API 作为 OAUTH2-Provider 的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38845999/
我已将 Keycloak 设置为 SAML 代理,身份验证由当局提供的外部 IdP 完成。使用此 IdP 登录的用户都被接受,我们需要从 Keycloak 获得一个 OAuth token 来访问我们
我在 master 有一个服务帐号领域。来自 admin-cli我要分配服务帐号master-realm-client管理员角色。我怎样才能做到这一点。 kcadm.sh add-roles -r m
在 Keycloak 中,是否可以对同一领域中的所有客户端仅进行一次登录?我已经以这种方式配置了服务器(从管理控制台): - 创建一个新领域(我们称之为 MyRealm); - 创建两个不同的客户端(
我们的团队正在开发一个集成到 Keycloak 中的项目。我们创建了一个自定义领域,例如 ProjectX ,并使其上的自定义主题能够应用于 Keycloak 的登录页面。 由于我们的主题应用于领域
Keycloak 是一个很棒的工具,但它缺乏适当的文档。 所以我们有 Realm.roles、Client.roles 和 User.roles 使用特定客户端访问应用程序时,这 3 者如何协同工作?
我们的团队正在开发一个集成到 Keycloak 中的项目。我们创建了一个自定义领域,例如 ProjectX ,并使其上的自定义主题能够应用于 Keycloak 的登录页面。 由于我们的主题应用于领域
有没有办法让所有用户在 keycloak 中创建自定义用户属性(如电话号码)? 最佳答案 您可以创建一个组并向其添加一个属性。 然后将该组设置为默认组。这样,所有用户都可以使用设置为组的属性 关于ke
我还尝试了 Web 来源和有效重定向 URI 的所有不同组合 我通过 keycloak 登录,它不断地在我的本地主机应用程序和这个 url 之间来回重定向我:http://localhost:4200
在 Keycloak's documentation ,据说为了部署提供程序,我可以 copy your provider jar to the Keycloak deploy/ directory,
目前,我使用此端点一次将用户添加到一个组: PUT /{realm}/users/{id}/groups/{groupId} 在我的用例中,批量执行影响是有益的,到目前为止我还没有找到这样做的记录方式
目前,我使用此端点一次将用户添加到一个组: PUT /{realm}/users/{id}/groups/{groupId} 在我的用例中,批量执行影响是有益的,到目前为止我还没有找到这样做的记录方式
我一直在尝试在 docker-compose 文件中使用 jboss/keycloak-mysql 来建立 Keycloak 服务器和 mysql 数据库。我在本地部署期间遇到一个问题,告诉我 WEB
我正在使用 Tomcat 适配器运行 Keycloak。但是,当我尝试获取 KeycloakPrincipal 时,它出错了; java.lang.ClassCastException: org.ke
我正在使用 keycloak 4.5.0 v 并创建了一个领域。我已经设置了登录以启用忘记用户名和验证电子邮件。在我输入的电子邮件选项卡中 host - smtp.gmail.com smtp po
我想让我的客户端应用程序从 keycloak 访问用户信息。因此,我在 keycloak 中创建了另一个领域 (myrealm1),并在该领域内创建了一个新客户端 (myclient1)。 key 斗
正如我在此链接中看到的 https://www.keycloak.org/docs/latest/authorization_services/#_overview ,客户端中应该有一个授权选项卡,如
这些 keycloak 端点有什么用? issuer: "http://localhost:8180/auth/realms/dev", authorization_endpoint: "http:/
我们需要将数百个用户从 csv 文件导入 Keycloak。我还没有找到任何现成的导入功能来做到这一点。 有没有人做过任何导入程序或至少有一些框架来构建? REST API 可能是唯一的方法 - 或者
我已经使用 LDAP 用户联盟配置了 Keycloak。当用户想要登录应用程序时,他会被重定向到 Keycloak 登录页面,输入 uid/pwd 并使用 LDAP 绑定(bind)进行身份验证。 这
有没有人在 Keycloak 中使用过 SCIM?如果是这样,你能指出我的文档吗?我用谷歌搜索过,它似乎不是受支持的配置。 最佳答案 不幸的是,Keycloak 尚不支持 SCIM。他们的 Jira
我是一名优秀的程序员,十分优秀!