Mam backend napisany w Springu oraz frontned napisany w Angularze i staram się napisać logowanie do systemu.
Zamysł jest taki, wystawiam REST API które przyjmuje login i hasło użytkownika i po poprawnej walidacji zwraca access oraz refresh token w postaci HttpCookie. Do każdego następnego requestu dołączam te tokeny i je waliduje przed wpuszczeniem użytkownika do systemu.
W każdym razie, nie działa to dokładnie tak jak myślałem.
Po stronie backendu dla celów testowych mam coś takiego:
@PostMapping("/sign-in")
fun signIn(@RequestBody request: SignInRequest, response: HttpServletResponse): ResponseEntity<Void> {
val accessTokenCookie = Cookie("access_token", "access_token_value")
accessTokenCookie.isHttpOnly = true
response.addCookie(accessTokenCookie)
return ResponseEntity(HttpStatus.OK)
}
Oraz filtr, który każdy sprawdza każdy przychodzący request, którego faktycznie implementacja również jest zbędna, póki co po prostu loguje to co przychodzi
request.cookies?.forEach { println(it.name + " : " + it.value) } ?: print("no cookies")
No i po stronie frontu, mam takie dwie metody
httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
withCredentials: true,
observe: 'response' as 'response'
};
signIn() {
this.httpClient.post("http://localhost:8081/api/auth/sign-in", {
email: "test@user.com",
password: "user",
},
this.httpOptions
).subscribe()
}
testCall() {
this.httpClient.get(
"http://localhost:8081/api/test",
this.httpOptions
).subscribe()
}
Po pierwszym strzale do sign-in
w network widzę ustawione cookies
Każdy kolejny strzał do tego endpointu pokazuje mi też wspomniane cookie załączone do requestu.
Problem jednak pojawia się gdy wywołuje testCall()
, żadne cookies nie są wtedy dołączone do requestu
Pozostaje więc pytanie - czemu?
- screenshot-20210514230623.png (20 KB) - ściągnięć: 7