Nội dung

    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.

    401 - Unauthorized

    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ế

    1. 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.

    2. 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.

    3. 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ô 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.3Khô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.4Bộ 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.501Quyề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.502Quyề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.503Truy 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.504Truy 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.