{
"метка времени": "2024-05-22T22:40:11.899+00:00",
"статус": 403,
"ошибка": "Запрещено",
"сообщение": "Доступ запрещен",
"path": "/api/1.0/users"
>
В выходных данных Println функция VerifiedTokrn в классе FirebaseTokenVerifier выдает вывод "verify".
Код: Выделить всё
public class FirebaseTokenVerifier {
private final FirebaseAuth firebaseAuth;
public FirebaseTokenVerifier() {
firebaseAuth = FirebaseAuth.getInstance();
}
public FirebaseToken verifyToken(String token) {
try {
FirebaseToken decodedToken = firebaseAuth.verifyIdToken(token);
System.err.println("Verify");
return decodedToken;
} catch (FirebaseAuthException e) {
System.err.println("No Verify");
return null;
}
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void initializeFirebaseApp() {
try {
FileInputStream serviceAccount = new FileInputStream("./serviceAccountKey.json");
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(serviceAccount))
.build();
FirebaseApp.initializeApp(options);
} catch (IOException e) {
throw new RuntimeException("Error initializing Firebase App", e);
}
}
@Bean
public FirebaseTokenVerifier firebaseTokenVerifier() {
return new FirebaseTokenVerifier();
}
@Bean
public FirebaseTokenAuthenticationFilter firebaseTokenAuthenticationFilter() throws Exception {
FirebaseTokenAuthenticationFilter filter = new FirebaseTokenAuthenticationFilter(firebaseTokenVerifier());
filter.setAuthenticationManager(authenticationManager());
return filter;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
FirebaseTokenAuthenticationFilter filter = firebaseTokenAuthenticationFilter();
filter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class));
http.addFilterBefore(filter, UsernamePasswordAuthenticationFilter.class); // FirebaseTokenAuthenticationFilter'ı UsernamePasswordAuthenticationFilter'dan önce ekle
http.authorizeRequests()
.requestMatchers("/api/1.0/users/**")
.authenticated()
.anyRequest().permitAll();
return http.build();
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setPasswordEncoder(passwordEncoder());
provider.setUserDetailsService(userDetailsService());
return provider;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public UserDetailsService userDetailsService() {
List users = new ArrayList();
UserDetails user = User.withUsername("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
users.add(user);
return new InMemoryUserDetailsManager(users);
}
@Bean
public AuthenticationManager authenticationManager() throws Exception {
return new ProviderManager(Arrays.asList(authenticationProvider()));
}
}
public class FirebaseTokenAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
private final FirebaseTokenVerifier firebaseTokenVerifier;
public FirebaseTokenAuthenticationFilter(FirebaseTokenVerifier firebaseTokenVerifier) {
super(new RequestHeaderRequestMatcher("Authorization"));
this.firebaseTokenVerifier = firebaseTokenVerifier;
}
public void setAuthenticationManager(AuthenticationManager authenticationManager) {
super.setAuthenticationManager(authenticationManager);
}
private Authentication getAuthentication(String jwtToken) {
FirebaseToken token = firebaseTokenVerifier.verifyToken(jwtToken);
List authoritiesList = new ArrayList();
authoritiesList.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
return new UsernamePasswordAuthenticationToken(token.getUid(), token, authoritiesList);
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7); // "Bearer " ifadesini kaldır
if (firebaseTokenVerifier.verifyToken(token) != null) {
return getAuthentication(token);
}
}
// Token doğrulanamadı veya eksik
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid or missing token");
return null;
}
}
public class FirebaseTokenAuthentication extends AbstractAuthenticationToken {
private final String token;
public FirebaseTokenAuthentication(String token) {
super(Collections.emptyList());
this.token = token;
}
@Override
public Object getCredentials() {
return token;
}
@Override
public Object getPrincipal() {
return token;
}
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... h-firebase
Мобильная версия