Phản hồi máy chủ 401 Unauthorized
HTTP Status Code 401 (Unauthorized)
Mã trạng thái HTTP 401 (Unauthorized) cho biết yêu cầu không được thực hiện vì thiếu xác thực hợp lệ cho tài nguyên mục tiêu. Mã này thường xuất hiện trong phát triển web và có thể gây hiểu lầm cho các nhà phát triển, đặc biệt khi làm việc với API. Trong bài viết này, chúng ta sẽ xem xét các nguyên nhân dẫn đến mã trạng thái này, các ví dụ thực tế và cách khắc phục trên nhiều ngôn ngữ lập trình khác nhau.
Nguyên nhân phát sinh mã trạng thái 401
- Thiếu dữ liệu xác thực
- Dữ liệu đăng nhập không chính xác
- Mã thông báo truy cập hết hạn
- Định dạng tiêu đề xác thực không đúng
Ví dụ thực tế
-
Ví dụ 1: Lỗi khi truy cập vào tài nguyên bảo mật
Mô tả: Người dùng cố gắng truy cập vào API yêu cầu xác thực nhưng không cung cấp bất kỳ thông tin đăng nhập nào.
Hành vi mong đợi: Máy chủ trả về mã trạng thái 401.
-
Ví dụ 2: Dữ liệu đăng nhập không chính xác
Mô tả: Người dùng gửi yêu cầu với tên đăng nhập và mật khẩu sai.
Hành vi mong đợi: Máy chủ trả về mã trạng thái 401 với thông báo xác thực không thành công.
-
Ví dụ 3: Sử dụng mã thông báo đã hết hạn
Mô tả: Người dùng cố gắng sử dụng mã thông báo đã hết hạn.
Hành vi mong đợi: Máy chủ trả về mã trạng thái 401 với yêu cầu làm mới mã thông báo.
Cách khắc phục lỗi 401 trên các ngôn ngữ lập trình khác nhau
JavaScript (Node.js)
Xử lý xác thực bằng cách sử dụng thư viện jsonwebtoken
.
const jwt = require('jsonwebtoken');
app.get('/protected', (req, res) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(401).send('Unauthorized');
}
jwt.verify(token, 'secret_key', (err, user) => {
if (err) {
return res.status(401).send('Unauthorized');
}
res.send('Access granted');
});
});
Python (Flask)
Sử dụng thư viện Flask
để kiểm tra dữ liệu xác thực.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/protected')
def protected():
auth = request.authorization
if not auth or not (auth.username == 'user' and auth.password == 'pass'):
return jsonify({'message': 'Unauthorized'}), 401
return jsonify({'message': 'Access granted'})
PHP
Xử lý xác thực thông qua các tiêu đề.
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('HTTP/1.0 401 Unauthorized');
echo 'Unauthorized';
exit;
} else {
if ($_SERVER['PHP_AUTH_USER'] !== 'user' || $_SERVER['PHP_AUTH_PW'] !== 'pass') {
header('HTTP/1.0 401 Unauthorized');
echo 'Unauthorized';
exit;
}
echo 'Access granted';
}
?>
Tóm tắt các nguyên nhân và cách khắc phục mã trạng thái 401
Nguyên nhân | Hành động khắc phục |
---|---|
Thiếu dữ liệu xác thực | Cung cấp thông tin đăng nhập |
Dữ liệu đăng nhập không chính xác | Kiểm tra và sửa đổi thông tin đăng nhập |
Mã thông báo truy cập hết hạn | Đăng nhập lại để nhận mã thông báo mới |
Định dạng tiêu đề xác thực không đúng | Kiểm tra định dạng tiêu đề và các tham số |
Mã bổ sung
Mã | Mô tả |
---|---|
401.1 | Đăng nhập không thành công - Nỗ lực đăng nhập không thành công do tên người dùng hoặc mật khẩu không đúng. |
401.2 | Đăng nhập không thành công do cấu hình máy chủ - Có sự cố với cấu hình xác thực trên máy chủ. |
401.3 | Không được phép do ACL trên tài nguyên - Quyền truy cập bị từ chối do quyền hệ thống tệp NTFS. |
401.4 | Bộ lọc không cấp quyền - Bộ lọc ISAPI đã chặn yêu cầu do sự cố cấp quyền. |
401.5 | Ứng dụng ISAPI/CGI không cấp quyền - Ứng dụng ISAPI hoặc CGI đã chặn yêu cầu do sự cố cấp quyền. |
401.501 | Quyền truy cập bị từ chối: đạt đến giới hạn tốc độ yêu cầu đồng thời - Quá nhiều yêu cầu đồng thời từ cùng một IP máy khách. |
401.502 | Quyền truy cập bị từ chối: đạt đến giới hạn tốc độ yêu cầu tối đa - IP máy khách đã vượt quá số lượng yêu cầu tối đa trong thời gian chỉ định. |
401.503 | Truy cập bị từ chối: Địa chỉ IP bị từ chối - Địa chỉ IP của máy khách nằm trong danh sách từ chối. |
401.504 | Truy cập bị từ chối: Tên máy chủ bị từ chối - Tên máy chủ của máy khách nằm trong danh sách từ chối. |