Я экспериментирую с gRPC с использованием «backend» и Android «front-end» на основе Spring, идея заключается в том, что я попрошу токен доступа с использованием типа предоставления пароля через HTTP (используя стандартную конечную точку RESTful/oauth/token) и использовать токен доступа, предоставляемый во всех последующих запросах через RPC (установка заголовка авторизации).gRPC и OAuth2 Аутентификация с весной Безопасность
У меня есть серверный перехватчик gRPC на моем «backend» моей пружины, который получит заголовок авторизации от вызова сервера и аутентифицирует токен доступа к хранилищу токенов.
Я застрял в том, что делать дальше или даже если то, что у меня есть до сих пор, является «правильным» подходом.
Это мой перехватчик:
@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);
}
}
Как получить маркер службы и как проверить подлинность моего пользователя от этой службы, используя только маркер доступа я обеспечиваю себя.
Моя конфигурация безопасности выглядит следующим образом:
@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);
}
}
Должен ли я быть установкой службы маркеров вручную здесь, а затем инъекционной, что в мой перехватчик или ??? Что такое «самый веский» способ добиться этого?
Любая помощь очень ценится!
Точно, что я сделал в конце. Спасибо за ответ! – CurtisWebDev