Cách sử dụng
- Nhập Tên người dùng và Mật khẩu.
- Sao chép Header Authorization vừa tạo vào ứng dụng client của bạn, hoặc dùng Lệnh curl để thử gửi yêu cầu.
- Để đọc một header có sẵn, hãy dán nó vào phần Giải mã header có sẵn, tên người dùng và mật khẩu sẽ hiện ra.
Cách hoạt động của xác thực HTTP Basic
Xác thực Basic được định nghĩa trong RFC 7617. Khi một tài nguyên được bảo vệ, máy chủ phản hồi bằng 401 Unauthorized kèm header WWW-Authenticate: Basic realm="...". Sau đó, client nối tên người dùng và mật khẩu bằng dấu hai chấm, mã hóa kết quả thành Base64 và gửi kèm trong mọi yêu cầu:
Authorization: Basic base64(username ":" password)
# Ví dụ từ RFC 7617: người dùng "Aladdin", mật khẩu "open sesame"
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Trình duyệt tự xử lý quá trình trao đổi này và hiển thị hộp thoại đăng nhập, còn script và client API thường gửi header ngay trong yêu cầu đầu tiên mà không chờ máy chủ yêu cầu xác thực. Vì dấu hai chấm dùng để phân tách hai giá trị, tên người dùng không được chứa dấu hai chấm; mật khẩu thì có thể. Máy chủ có thể thêm charset="UTF-8" vào yêu cầu xác thực (challenge) để báo rằng thông tin đăng nhập có ký tự ngoài ASCII cần được gửi ở dạng UTF-8.
Base64 không phải là mã hóa bảo mật
Header trông có vẻ bị xáo trộn, nhưng bất kỳ ai nhìn thấy nó đều có thể khôi phục mật khẩu trong vài giây, bằng công cụ giải mã trên trang này hoặc bất kỳ bộ giải mã Base64 nào. Xác thực Basic chỉ chấp nhận được khi dùng qua HTTPS, nơi TLS mã hóa header trong quá trình truyền. Ngoài ra, hãy lưu ý rằng:
- thông tin đăng nhập được gửi kèm mọi yêu cầu, nên chỉ cần một yêu cầu HTTP không mã hóa là đủ làm lộ chúng;
- proxy, bộ cân bằng tải và công cụ gỡ lỗi có thể ghi header
Authorizationvào nhật ký nếu không được cấu hình để bỏ qua; - trình duyệt ghi nhớ thông tin đăng nhập đã nhập cho đến khi bị đóng, và không có cách chuẩn nào để đăng xuất.
Với API công khai, token API có thể thu hồi hoặc OAuth là lựa chọn phù hợp hơn. Xác thực Basic vẫn là lựa chọn hợp lý cho công cụ nội bộ, trang staging và các lệnh gọi giữa máy chủ với máy chủ qua TLS.
Gửi header từ mã nguồn
# curl tự tạo header
curl -u 'user:password' https://api.example.com/
// JavaScript fetch (btoa chỉ xử lý được ký tự Latin-1)
fetch(url, { headers: { Authorization: 'Basic ' + btoa('user:password') } })
# Python requests
requests.get(url, auth=('user', 'password'))
Tránh nhúng thông tin đăng nhập vào URL, như trong https://user:password@host/. RFC 3986 không khuyến khích dạng này, nó còn bị lưu lại trong lịch sử trình duyệt và nhật ký máy chủ, và các trình duyệt hiện đại đều hạn chế nó.
Câu hỏi thường gặp
Làm sao để giải mã header Basic Auth?
Dán header vào phần Giải mã header có sẵn, tên người dùng và mật khẩu sẽ hiện ra ngay. Bất kỳ bộ giải mã Base64 nào cũng cho kết quả tương tự, và đó chính là lý do header này chỉ được truyền qua HTTPS.
Mật khẩu có được chứa dấu hai chấm không?
Có. Máy chủ tách giá trị đã giải mã tại dấu hai chấm đầu tiên, nên mọi thứ phía sau đều thuộc về mật khẩu. Tuy nhiên, tên người dùng không được chứa dấu hai chấm.
Xác thực HTTP Basic có an toàn không?
Khi dùng qua HTTPS với mật khẩu mạnh và không trùng lặp, nó bảo vệ thông tin đăng nhập trong quá trình truyền, nhưng thông tin này được gửi kèm mọi yêu cầu và không thể hết hạn như token. Đừng bao giờ dùng nó qua HTTP thông thường.
Vì sao đăng nhập thất bại với mật khẩu có dấu hoặc ký tự không phải chữ Latin?
charset="UTF-8"; nếu không có khai báo này, các máy chủ cũ có thể mặc định dùng ISO-8859-1 và so sánh các byte khác nhau.Mật khẩu của tôi có bị gửi đi đâu không?
Không. Header được tạo bằng JavaScript trong trình duyệt của bạn và không có gì được truyền đi. Dù vậy, hãy dùng thông tin đăng nhập thử nghiệm khi chia sẻ lệnh curl đã tạo với người khác.