Problema resolvido.
Fiz um teste de login pelo Thunder do VSCode e por lá não retornava nada no headers, assim percebi que minha API passa o token só pelo body mesmo.
Então criei um model no Angular correspondente ao retorno do login, assim:
export interface Login {
name: string,
email: string,
token: string
}
E no método authenticate() passei esse model como retorno do post<> e peguei o token pelo body, ficou assim:
authenticate(user: User) {
return this.http.post<Login>(this.API, user, {observe: 'response'})
.pipe(tap(res => {
const token = res.body?.token;
console.log(`User ${user.email} authenticated with token ${token}`);
}));
}
Deu certo: