无法从KeyCloak获取访问令牌

时间:2019-11-25 07:32:57

标签: spring-boot security keycloak keycloak-services

我正在尝试使用邮递员从Keycloak服务器获取访问令牌。

我一直遵循此link,并按照本教程中的说明创建了领域,用户,角色凭证。

但是当我发出请求时,它会无限期地继续进行,而不会返回任何内容。

编辑: 我也尝试将Grant_type设置为“ password”和“ client_credentials”。但没有运气。

enter image description here

2 个答案:

答案 0 :(得分:0)

这是从PostMan获取令牌的正确方法

https://<IP ADDRESS>:<PORT>/auth/realms/master/protocol/openid-connect/token

在“正文”部分中,选择x-www-form-urlencoded

{
   "username": "username",
   "password": "password",
   "client_id": "APP-NAME",
   "grant_type": "password",
   "client_secret": "462fe347-d47f-4365-94ee-6aefff994ef2"
}

要获得更清晰的解决方案,请像这样使用 enter image description here

If you want to from through `curl` command then use below command 
curl -X POST -k -H 'Content-Type: application/x-www-form-urlencoded' -i 'https://<IP>:<PORT>/auth/realms/master/protocol/openid-connect/token' --data 'username=username&password=password&client_id=CLIENT-ID&grant_type=password&client_secret=462fe347-d47f-4365-94ee-6aefff994ef2'

**编辑**

正如在最后找到的解决方案中在SO聊天中与OP讨论的那样,OP正在使用临时密码创建用户,因此每次用户登录时都必须更改密码,这就是其失败原因。在OP更改了禁用选项之后,它开始工作 enter image description here

答案 1 :(得分:0)

在此示例中,您不能使用 client_credentials ,因为这里没有客户密码,您可以阅读有关Client Credentials Grant的信息。它还主要用于服务器到服务器的通信。 您不应该使用密码授予,但是我想出于示例的原因。 Password Grant

这就是我得到的 enter image description here

问题是您如何配置Spring-boot应用程序? 这是本教程中提到的application.properties:

keycloak.realm=SpringBootKeycloak
keycloak.auth-server-url=http://localhost:8080/auth/
keycloak.resource=login-app
keycloak.public-client=true

这就是我的SecurityConfig的样子

@Configuration
@EnableWebSecurity
@ComponentScan(
        basePackageClasses = KeycloakSecurityComponents.class,
        excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.keycloak.adapters.springsecurity.management.HttpSessionManager"))
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
                .antMatchers("/*")
                .hasRole("user").anyRequest().permitAll();

    }
}