Hallo ich versuche Aktuell eine REST API zu erstellen, ich hatte es erst über Swagger versucht, musst aber feststellen das die JAVA Implementation von Swagger noch nicht wirklich gut ist, gehopst wie gesprungen, also habe ich versucht das mit Spring Boot zu machen.
das Erste Beispiel aus Basis dieser Seite:
https://gigsterous.github.io/engineering/2017/03/01/spring-boot-4.html
lief auch erstmal super, das Beispiel lief und machte das was ich wollte. Soweit so gut, also habe ich versucht das Beispiel zu in meinem eigenen Projekt nach zubauen, auch das lief soweit erst mal gut, leider ist es so das ich mich an der API nicht anmelden kann.
ich bekomme immer wieder die meldung:
{"timestamp":1514905794221,"status":401,"error":"Unauthorized","message":"Bad credentials","path":"/Api/oauth/token"}
erst dachte ich das er aus irgendwelche Gründen den Benutzer nicht sauber aus der DB laden kann, oder das Passwort nicht oder Falsch gehasht wird oder sowas in die richtung, allerdings scheint das hier nicht der fall zu sein, nach dem ich das Logging auf debug gestellt hatte bekomme ich jetzt auch ausführlicherere Information
logauszug:
2018-01-02 16:09:53.915 DEBUG 25056 --- [qtp561480862-19] o.s.s.w.u.matcher.AntPathRequestMatcher : Request 'POST /oauth/token' doesn't match 'DELETE /logout
2018-01-02 16:09:53.921 DEBUG 25056 --- [qtp561480862-19] o.s.s.web.util.matcher.OrRequestMatcher : No matches found
2018-01-02 16:09:53.921 DEBUG 25056 --- [qtp561480862-19] o.s.security.web.FilterChainProxy : /oauth/token at position 5 of 11 in additional filter chain; firing Filter: 'BasicAuthenticationFilter'
2018-01-02 16:09:53.928 DEBUG 25056 --- [qtp561480862-19] o.s.s.w.a.www.BasicAuthenticationFilter : Basic Authentication Authorization header found for user 'builttapi'
2018-01-02 16:09:53.932 DEBUG 25056 --- [qtp561480862-19] o.s.s.authentication.ProviderManager : Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider
2018-01-02 16:09:53.956 DEBUG 25056 --- [qtp561480862-19] o.s.s.a.dao.DaoAuthenticationProvider : User 'testuser' not found
2018-01-02 16:09:53.970 DEBUG 25056 --- [qtp561480862-19] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'authenticationAuditListener'
2018-01-02 16:09:53.971 DEBUG 25056 --- [qtp561480862-19] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'delegatingApplicationListener'
2018-01-02 16:09:53.980 DEBUG 25056 --- [qtp561480862-19] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'auditListener'
2018-01-02 16:09:53.981 DEBUG 25056 --- [qtp561480862-19] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'delegatingApplicationListener'
2018-01-02 16:09:53.982 DEBUG 25056 --- [qtp561480862-19] o.s.b.a.audit.listener.AuditListener : AuditEvent [timestamp=Tue Jan 02 16:09:53 CET 2018, principal=testuser, type=AUTHENTICATION_FAILURE, data={details=org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1; SessionId: null, type=org.springframework.security.authentication.BadCredentialsException, message=Bad credentials}]
2018-01-02 16:09:53.984 DEBUG 25056 --- [qtp561480862-19] o.s.s.w.a.www.BasicAuthenticationFilter : Authentication request for failed: org.springframework.security.authentication.BadCredentialsException: Bad credentials
vor allem aber dieses Zeile lässt mich etwas stuzen:
2018-01-02 16:09:53.956 DEBUG 25056 --- [qtp561480862-19] o.s.s.a.dao.DaoAuthenticationProvider : User 'testuser' not found
der entsprechende JAVA Code dazu:
[OAuth2Config.java]
als erstes muss ich erstmal zugeben, das ich diesen Teil des Codes nicht wirklich verstehe, scheinbar wird hier ein zusätzlicher Benutzer und Passwort Benutzt, warum weiss ich nicht, es stammt aus dem Beispiel und Funktioniert in diesem auch nur nicht bei mir und daraus ergeben Sich auch ein oder zwei Fragen:
hier erst ein mal noch die Komplette Klasse:
Sooooo:
kann mir jemand Helfen?
das Erste Beispiel aus Basis dieser Seite:
https://gigsterous.github.io/engineering/2017/03/01/spring-boot-4.html
lief auch erstmal super, das Beispiel lief und machte das was ich wollte. Soweit so gut, also habe ich versucht das Beispiel zu in meinem eigenen Projekt nach zubauen, auch das lief soweit erst mal gut, leider ist es so das ich mich an der API nicht anmelden kann.
ich bekomme immer wieder die meldung:
{"timestamp":1514905794221,"status":401,"error":"Unauthorized","message":"Bad credentials","path":"/Api/oauth/token"}
erst dachte ich das er aus irgendwelche Gründen den Benutzer nicht sauber aus der DB laden kann, oder das Passwort nicht oder Falsch gehasht wird oder sowas in die richtung, allerdings scheint das hier nicht der fall zu sein, nach dem ich das Logging auf debug gestellt hatte bekomme ich jetzt auch ausführlicherere Information
logauszug:
2018-01-02 16:09:53.915 DEBUG 25056 --- [qtp561480862-19] o.s.s.w.u.matcher.AntPathRequestMatcher : Request 'POST /oauth/token' doesn't match 'DELETE /logout
2018-01-02 16:09:53.921 DEBUG 25056 --- [qtp561480862-19] o.s.s.web.util.matcher.OrRequestMatcher : No matches found
2018-01-02 16:09:53.921 DEBUG 25056 --- [qtp561480862-19] o.s.security.web.FilterChainProxy : /oauth/token at position 5 of 11 in additional filter chain; firing Filter: 'BasicAuthenticationFilter'
2018-01-02 16:09:53.928 DEBUG 25056 --- [qtp561480862-19] o.s.s.w.a.www.BasicAuthenticationFilter : Basic Authentication Authorization header found for user 'builttapi'
2018-01-02 16:09:53.932 DEBUG 25056 --- [qtp561480862-19] o.s.s.authentication.ProviderManager : Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider
2018-01-02 16:09:53.956 DEBUG 25056 --- [qtp561480862-19] o.s.s.a.dao.DaoAuthenticationProvider : User 'testuser' not found
2018-01-02 16:09:53.970 DEBUG 25056 --- [qtp561480862-19] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'authenticationAuditListener'
2018-01-02 16:09:53.971 DEBUG 25056 --- [qtp561480862-19] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'delegatingApplicationListener'
2018-01-02 16:09:53.980 DEBUG 25056 --- [qtp561480862-19] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'auditListener'
2018-01-02 16:09:53.981 DEBUG 25056 --- [qtp561480862-19] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'delegatingApplicationListener'
2018-01-02 16:09:53.982 DEBUG 25056 --- [qtp561480862-19] o.s.b.a.audit.listener.AuditListener : AuditEvent [timestamp=Tue Jan 02 16:09:53 CET 2018, principal=testuser, type=AUTHENTICATION_FAILURE, data={details=org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1; SessionId: null, type=org.springframework.security.authentication.BadCredentialsException, message=Bad credentials}]
2018-01-02 16:09:53.984 DEBUG 25056 --- [qtp561480862-19] o.s.s.w.a.www.BasicAuthenticationFilter : Authentication request for failed: org.springframework.security.authentication.BadCredentialsException: Bad credentials
vor allem aber dieses Zeile lässt mich etwas stuzen:
2018-01-02 16:09:53.956 DEBUG 25056 --- [qtp561480862-19] o.s.s.a.dao.DaoAuthenticationProvider : User 'testuser' not found
der entsprechende JAVA Code dazu:
[OAuth2Config.java]
Java:
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception
{
logger.info("Config Client ... .. .");
clients.inMemory().withClient("testuser").secret("secret").accessTokenValiditySeconds(expiration)
.scopes("read", "write").authorizedGrantTypes("password", "refresh_token")
.resourceIds("resource");
}
als erstes muss ich erstmal zugeben, das ich diesen Teil des Codes nicht wirklich verstehe, scheinbar wird hier ein zusätzlicher Benutzer und Passwort Benutzt, warum weiss ich nicht, es stammt aus dem Beispiel und Funktioniert in diesem auch nur nicht bei mir und daraus ergeben Sich auch ein oder zwei Fragen:
hier erst ein mal noch die Komplette Klasse:
Java:
package com.webservice.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import com.webservice.ApiApplication;
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter
{
private static final Logger logger = LoggerFactory.getLogger(OAuth2Config.class);
@Autowired
@Qualifier("userDetailsService")
private UserDetailsService userDetailsService;
@Autowired
private AuthenticationManager authenticationManager;
@Value("${webservice.oauth.tokenTimeout:3600}")
private int expiration;
// password encryptor
@Bean
public PasswordEncoder passwordEncoder()
{
logger.info("Create Password Encoder ... .. .");
return new BCryptPasswordEncoder();
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer configurer) throws Exception
{
logger.info("Set OAuth Config ... .. .");
configurer.authenticationManager(authenticationManager);
configurer.userDetailsService(userDetailsService);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception
{
logger.info("Config Client ... .. .");
clients.inMemory().withClient("testuser").secret("secret").accessTokenValiditySeconds(expiration)
.scopes("read", "write").authorizedGrantTypes("password", "refresh_token")
.resourceIds("resource");
}
}
Sooooo:
- wofür brauche ich einen 2ten Benutzername und Passwort?
- wo werden diese Gespeichert?
- ist das so überhaupt sinvoll ?
kann mir jemand Helfen?