Ich experimentiere mit gRPC mit einem Spring-basierten 'Backend' und Android 'Front-End', die Idee ist, dass ich ein Zugriffs-Token mit dem Passwort-Grant-Typ über HTTP anfordern (Verwenden Sie den RESTful-Endpunkt standard/oauth/token) und verwenden Sie das Zugriffstoken, das in allen nachfolgenden Anforderungen über RPC bereitgestellt wird (Festlegen des Autorisierungsheaders).gRPC und OAuth2 Authentifizierung mit Spring Security
Ich habe einen gRPC-Server Interceptor auf meinem Frühjahr 'Backend', die den Autorisierungsheader vom Server-Aufruf erhalten und das Zugriffs-Token gegen den Token-Speicher authentifizieren.
Ich bin fest, was als nächstes zu tun oder sogar, wenn das, was ich bisher habe, ist der "richtige" Ansatz.
Das ist mein Interceptor:
@Component
public class GrpcRequestInterceptor implements ServerInterceptor {
private AuthenticationManager authenticationManager;
public GrpcRequestInterceptor(AuthenticationManager authenticationManager, AuthorizationCodeServices authorizationCodeServices) {
this.authenticationManager = authenticationManager;
}
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> serverCall, Metadata metadata, ServerCallHandler<ReqT, RespT> serverCallHandler) {
String authorizationHeader = metadata.get(Metadata.Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER));
PreAuthenticatedAuthenticationToken preAuthenticatedAuthenticationToken =
new PreAuthenticatedAuthenticationToken(authorizationHeader.substring("Bearer ".length()), "");
PreAuthenticatedAuthenticationProvider preAuthenticatedAuthenticationProvider = new PreAuthenticatedAuthenticationProvider();
preAuthenticatedAuthenticationProvider.setPreAuthenticatedUserDetailsService(new AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken>() {
@Override
public UserDetails loadUserDetails(PreAuthenticatedAuthenticationToken preAuthenticatedAuthenticationToken) throws UsernameNotFoundException {
????
}
});
Authentication authentication = preAuthenticatedAuthenticationProvider.authenticate(preAuthenticatedAuthenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
return serverCallHandler.startCall(serverCall, metadata);
}
}
Wie kann ich den Token-Service erhalten und wie authentifizieren ich meinen Benutzer gegen diesen Dienst nur das Zugriffstoken ich mit mir selbst bereitstellt.
Meine Sicherheit Config ist wie folgt:
@Configuration
@EnableAuthorizationServer
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AccountDetailsService accountDetailsService;
@Profile(value = "development")
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/h2-console/**");
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(accountDetailsService)
.passwordEncoder(initPasswordEncoder());
}
@Bean
public PasswordEncoder initPasswordEncoder() {
return new BCryptPasswordEncoder(10);
}
}
Sollte ich hier die Tokendienst manuell einstellen und dann, dass in meine Interceptor Injektion oder ??? Was ist der "früheste" Weg, dies zu erreichen?
Jede Hilfe wird sehr geschätzt!
Genau was ich am Ende getan habe. Danke für die Antwort! – CurtisWebDev