Avatar
1
minhvd Beginner
minhvd Beginner
Hỏi về xử lý logout
em đang code web, trong có nút logout. nút này khi bấm vào thì sẽ điều hướng user tới homepage và gọi 1 api logout lên server. em muốn hỏi là khi xử lý api logout ở server, thì sẽ return ngay redirect set cookies để web điều hướng ngay. hay chờ cập nhật database xong thì mới return redirect để web điều hướng ạ. Cụ thể ở đây khi logout thì em sẽ cập nhật device token (firebase) của user đó thành inactive để không nhận được notification nữa
  • Answer
Remain: 5
1 Answer
Avatar
tvd12 Beginner
tvd12 Beginner
The Best Answer
Sẽ có 2 trường hợp ở đây:

Trường hợp 1: Em lưu token ở cookie, theo cách này thì nên logout ở server sử dụng cơ chế redirect, ví dụ code logout cho server sẽ thế này:

@Authenticated
@DoPost("/logout")
public Redirect logoutPost(
    HttpServletRequest request,
    @AdminId long adminId
) {
    adminService.removeAdminAccessToken(adminId);
    return redirectToLogin(request);
}

public static Redirect redirectToLogin(HttpServletRequest request) {
    Cookie tokenCookie = new Cookie("adminAccessToken", "");
    tokenCookie.setPath("/");
    tokenCookie.setMaxAge(0);
    Cookie tokenCookieExpiredAt = new Cookie("adminAccessTokenExpiredAt", "0");
    tokenCookieExpiredAt.setMaxAge(0);
    tokenCookieExpiredAt.setPath("/");
    return Redirect.builder().uri(HttpRequests.addLanguageToUri(request, "/login")).addCookie(tokenCookie).addCookie(tokenCookieExpiredAt).build();
}

Server sẽ loại bỏ token khỏi cơ sở dữ liệu sau đó gọi hàm setMaxAge để làm hết hạn token cookie và token cookie sẽ được tự động loại bỏ khỏi trình duyệt.

Lưu ý: Phải loại bỏ xong accessToken khỏi db, sau đó mới điều hướng, làm như vậy để đảm bảo rằng access token đã được loại bỏ hoàn toàn và bắt buộc người dùng phải đăng nhập để tạo access token mới.

Server cũng sẽ trả về mã 302 cho trình duyệt, trình duyệt khi thấy mã 302 sẽ tự động điều hướng sang trang home và em không cần code thêm bất cứ thứ gì cả.

Trường hợp 2. Em lưu tooken ở localStorage, theo cách này em có thể gọi API logout để nhận về mã 200 hoặc 204, em sẽ cần chờ cho đến khi nhận được phản hồi từ server để remove token khỏi localstorage sau đó mới điều hướng sang trang home.

Nhưng anh thấy việc lưu accessToken ở localStorage không tiện vì mỗi lần gọi API lại phải add vào header, trong khi dùng cookie nó tự động được luôn. Ngoài ra cookie nó còn liên quan đến làm SSO nữa, localstorage chưa chắc đã làm được. Hiện tại anh chưa có dự án nào lưu access token ở localstorage cả, anh toàn lưu ở cookie thôi.

  • 0
  • Reply
em muốn hỏi về chỗ anh nói về loại bỏ token ở db. cụ thể 2 câu:
  • ở đây e k thấy anh có await ở trước hàm removeAccessToken, vậy có nghĩa là mình sẽ ưu tiên trả luôn lệnh redirect về cho web điều hướng, mà không cần chờ lệnh xoá Db thành công đúng k?
  • e hỏi về cách thiết kế hệ thống tại sao lại cần 1 bảng để lưu token. thường thì e làm khi login success thì gen ra jwt trả access token cho web là xong. chưa hiểu tại sao lại cần có bảng để lưu access token
 –  minhvd 1685548628000
anh đã cập nhật câu trả lời nhé.  –  tvd12 1685548786000