Интерфейс Angular17 не отправляет заголовок с JWT на серверную часть JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Интерфейс Angular17 не отправляет заголовок с JWT на серверную часть Java

Сообщение Anonymous »

Я не могу понять поведение кода ниже. Я хотел узнать, как использовать JWT для связи между интерфейсом и сервером (я использую Angular17 и jdk21).
Части кода:
Угловой:
Перехватчик:

Код: Выделить всё

export const tokenInterceptor: HttpInterceptorFn = (req, next) => {
const authService = inject(AuthService);
if(authService.getToken()) {
const cloned = req.clone({
headers: req.headers.set('Authorization', 'Bearer ' + authService.getToken())
});
console.log('Headers: ', cloned.headers);
return next(cloned);
}
return next(req);
};
AccountComponent:

Код: Выделить всё

export class AccountComponent {
authService = inject(AuthService);
accountDetail$ = this.authService.getDetail();

}
AuthService:

Код: Выделить всё

login(data: LoginRequest): Observable{
var value = this.http.post(`${this.apiUrl}login`,data);
return value.pipe(
map((response) => {
if(response.success){
localStorage.setItem(this.tokenKey, response.token);
}
return response;
})
);
}

logout = (): void => {
localStorage.removeItem(this.tokenKey);
};

getDetail = (): Observable => {
return this.http.get(`${this.apiUrl}api/detail/1`);
}
app.config.ts:

Код: Выделить всё

export const appConfig: ApplicationConfig = {
providers: [provideRouter(routes), provideAnimationsAsync(), provideHttpClient(withInterceptors([tokenInterceptor]))]
};
Код Java:
Фильтр:

Код: Выделить всё

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.csrf(AbstractHttpConfigurer::disable).cors(AbstractHttpConfigurer::disable).authorizeHttpRequests(
//ahr -> ahr.requestMatchers("/login", "/signup", "/signup/roles").permitAll().requestMatchers("/api/detail/1").authenticated())
ahr -> ahr.requestMatchers("/login", "/signup", "/signup/roles", "/api/detail/1").permitAll())
.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
JwtRequestFilter:

Код: Выделить всё

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String authHeader = request.getHeader("authorization");
String token = null;
String username = null;

Enumeration headerNames = request.getHeaderNames();

while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
System.out.println("Header " + headerName+": ");
var headers = request.getHeaders(headerName);
while (headers.hasMoreElements()) {
String headerValue = headers.nextElement();
System.out.println(headerValue);
}
}
if (Objects.nonNull(authHeader) && authHeader.startsWith("Bearer ")) {
token = authHeader.substring(7);
username = jwtUtil.extractUsername(token);
}
...
Я могу разделить устранение неполадок на 3 этапа:
Этап 1:
< ul>
[*]В активной строке Java-фильтра:

Код: Выделить всё

 ahr -> ahr.requestMatchers("/login", "/signup", "/signup/roles").permitAll().requestMatchers("/api/detail/1").authenticated())
  • После входа в систему я вижу токен в локальном хранилище
  • Когда я перехожу к деталям, я получаю сообщение об ошибке: «CORS Missing Allow Origin» — и я не получил «аутентификацию» заголовка — я вижу это в распечатках серверной части, так что это правильное поведение серверной части;
  • Я выхожу из внешнего интерфейса -> localStorage пуст
Этап 2:
  • В активной строке Java-фильтра:

    Код: Выделить всё

    ahr ->  ahr.requestMatchers("/login", "/signup", "/signup/roles", "/api/detail/1").permitAll())
    
  • После входа в систему я вижу токен в локальном хранилище
  • Когда я перехожу к деталям, я вижу подробности, а также вижу заголовок «аутентификация» в журналах серверной части
  • Я выхожу из системы во внешнем интерфейсе -> localStorage пуст
Этап 3:
  • В фильтре Java снова активна строка:

Код: Выделить всё

ahr -> ahr.requestMatchers("/login", "/signup", "/signup/roles").permitAll().requestMatchers("/api/detail/1").authenticated())
  • После входа в систему я вижу токен в локальном хранилище
  • Я перехожу к деталям и... Я вижу детали и вижу заголовок «аутентификация» в журналах серверной части!?
  • Теперь, когда я выхожу из системы и снова вхожу в систему или закрываю и снова открываю браузер, я все равно вижу детали, но если сначала я выхожу из системы, а затем закрываю браузер, то после входа в систему у меня появляется ошибка.
Мой вопрос, как мне понять такое поведение? Для меня это совершенно странно. Была ли у кого-нибудь такая проблема?
Проверил серверную часть с помощью Postman - вроде работает, в том числе и с аутентификацией.

Подробнее здесь: https://stackoverflow.com/questions/792 ... va-backend
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»