0

【Nhà phát triển cần đọc】Hướng dẫn thực hành kiểm tra xác thực API! Công cụ và phương pháp sử dụng trong thực tế

Xin chào mọi người! Gần đây, tôi đã gặp phải vấn đề về xác thực API trong dự án của mình và đã thử nghiệm nhiều công cụ và phương pháp khác nhau. Hôm nay, tôi muốn chia sẻ những công cụ và phương pháp hữu ích cho việc kiểm tra xác thực API mà tôi đã sử dụng trong công việc phát triển hàng ngày!

Tại sao kiểm tra xác thực API lại quan trọng?

Tháng trước, ứng dụng mà đội của tôi đang phát triển đã gặp phải một vấn đề: do cài đặt quyền người dùng không chính xác, người dùng thông thường có thể xem được dữ liệu của quản trị viên. May mắn thay, chúng tôi đã phát hiện ra vấn đề trước khi triển khai lên môi trường sản xuất, nếu không hậu quả sẽ rất nghiêm trọng.

Vấn đề xác thực API là điểm đặc biệt cần lưu ý đối với nhà phát triển:

  • Rủi ro rò rỉ dữ liệu: Thông tin cá nhân hoặc dữ liệu kinh doanh quan trọng có thể bị rò rỉ ra bên ngoài
  • Trải nghiệm người dùng kém: Cài đặt quyền không chính xác có thể khiến người dùng không truy cập được các chức năng cần thiết
  • Chi phí sửa chữa tăng cao: Nếu phát hiện trong môi trường sản xuất, việc sửa chữa sẽ tốn nhiều thời gian và tài nguyên

Từ kinh nghiệm cá nhân về tầm quan trọng của kiểm tra xác thực, tôi đã đưa nó vào công việc phát triển hàng ngày. Hãy cùng xem những công cụ và phương pháp thực tế!

Công cụ kiểm tra mà nhà phát triển có thể sử dụng

Công cụ kiểm tra API cơ bản

  • Apidog: Đây là công cụ mà tôi gần đây đã chuyển từ Postman sang. Đặc biệt tiện lợi là tính năng biến môi trường, cho phép dễ dàng kiểm tra với các vai trò người dùng khác nhau. Ví dụ, bạn có thể thiết lập và chuyển đổi giữa nhiều cấp quyền như quản trị viên, người dùng thông thường, khách, giúp việc kiểm tra quyền trở nên hiệu quả hơn. apidog

  • Burp Suite Community Edition: Phiên bản miễn phí cũng có đủ tính năng để sử dụng. Đặc biệt là việc bắt và thay đổi request dễ dàng, giúp thực hiện các thử nghiệm như "Điều gì sẽ xảy ra nếu tôi thay đổi tham số này?". Tôi chủ yếu sử dụng nó để kiểm tra token JWT.

  • Insomnia: Một API client đơn giản và dễ sử dụng. Đặc biệt giỏi trong việc kiểm tra GraphQL, cho phép xây dựng và thực thi truy vấn một cách trực quan.

Tiện ích mở rộng trình duyệt hữu ích

  • JWT Debugger: Tiện ích mở rộng cho phép kiểm tra nội dung token JWT trên trình duyệt. Rất tiện lợi khi bạn muốn kiểm tra nhanh "Token này chứa những gì?" trong quá trình phát triển. Tôi sử dụng nó hàng ngày.

  • ModHeader: Tiện ích mở rộng cho phép dễ dàng thay đổi header của HTTP request. Giúp kiểm tra với các token xác thực khác nhau một cách thuận tiện. Đặc biệt hữu ích trong quá trình phát triển front-end.

Công cụ dòng lệnh

curl

  • curl: Công cụ HTTP request đơn giản nhưng mạnh mẽ. Dễ dàng tích hợp vào pipeline CI/CD cho kiểm tra tự động. Tôi thường viết các script như sau để tự động hóa kiểm tra xác thực:
# Request với token quản trị viên
ADMIN_TOKEN=$(curl -s -X POST http://api.example.com/login -d '{"username":"admin","password":"password"}' | jq -r '.token')
# Request với token người dùng thông thường
USER_TOKEN=$(curl -s -X POST http://api.example.com/login -d '{"username":"user","password":"password"}' | jq -r '.token')

# Truy cập cùng một endpoint với cả hai token và so sánh kết quả
curl -s -H "Authorization: Bearer $ADMIN_TOKEN" http://api.example.com/users > admin_response.json
curl -s -H "Authorization: Bearer $USER_TOKEN" http://api.example.com/users > user_response.json
diff admin_response.json user_response.json
  • jq: Công cụ dòng lệnh để xử lý dữ liệu JSON. Hữu ích để trích xuất và so sánh các giá trị cụ thể từ phản hồi API.

Phương pháp kiểm tra hữu ích trong phát triển thực tế

Tích hợp kiểm tra từ giai đoạn đầu phát triển

Đội của tôi sử dụng danh sách kiểm tra sau mỗi khi triển khai một endpoint API:

  1. Kiểm tra kiểm soát truy cập cơ bản:

    • Không thể truy cập mà không có xác thực?
    • Phản hồi phù hợp với các cấp quyền khác nhau?
  2. Kiểm tra trường hợp biên:

    • Truy cập với token hết hạn
    • Token có định dạng không hợp lệ
    • Cố gắng truy cập tài nguyên của người dùng khác

Việc biến điều này thành thói quen đã giúp chúng tôi phát hiện sớm các lỗi liên quan đến xác thực.

Chuẩn bị người dùng kiểm tra

Để kiểm tra hiệu quả, tôi chuẩn bị các tài khoản kiểm tra sau trong môi trường phát triển:

  • Quản trị viên (toàn quyền)
  • Người điều hành (một số quyền quản trị)
  • Người dùng thông thường (quyền cơ bản)
  • Người dùng mới (quyền tối thiểu)
  • Người dùng bị chặn (hạn chế truy cập)

Lưu trữ thông tin tài khoản này dưới dạng biến môi trường trong Apidog giúp chuyển đổi dễ dàng chỉ với một cú nhấp chuột.

Triển khai kiểm tra tự động

Việc tích hợp kiểm tra xác thực vào kiểm tra đơn vị hoặc kiểm tra E2E cũng rất quan trọng. Tôi tự động hóa các trường hợp kiểm tra như sau:

// Ví dụ về kiểm tra xác thực sử dụng Jest
describe('API Authentication Tests', () => {
  test('Unauthenticated user cannot access protected endpoint', async () => {
    const response = await request(app).get('/api/protected');
    expect(response.status).toBe(401);
  });

  test('User cannot access another user\'s data', async () => {
    const token = await loginAsUser('user1');
    const response = await request(app)
      .get('/api/users/user2/profile')
      .set('Authorization', `Bearer ${token}`);
    expect(response.status).toBe(403);
  });
});

Vấn đề thực tế và giải pháp

Trường hợp 1: Lỗi xác minh JWT

Trong một dự án gần đây, tôi nhận thấy việc xác minh chữ ký token JWT không được thực hiện đúng cách. Cụ thể, thuật toán không được chỉ định và hệ thống chấp nhận cả thuật toán 'none'.

Giải pháp: Sử dụng JWT_Tool để xác nhận lỗ hổng và sửa đổi cấu hình thư viện để chỉ định rõ thuật toán.

// Trước khi sửa
jwt.verify(token, secretKey);

// Sau khi sửa
jwt.verify(token, secretKey, { algorithms: ['HS256'] });

Trường hợp 2: Vấn đề cấu hình CORS

Trong một dự án khác, cấu hình CORS quá lỏng lẻo, cho phép truy cập API từ bất kỳ domain nào.

Giải pháp: Chỉ định rõ các nguồn gốc được phép và chỉ cho phép thông tin xác thực cho các request đã xác thực.

// Trước khi sửa
app.use(cors());

// Sau khi sửa
app.use(cors({
  origin: ['https://example.com', 'https://dev.example.com'],
  credentials: true
}));

Kết hợp công cụ được đề xuất

Trong công việc phát triển hàng ngày, tôi thấy các kết hợp sau đặc biệt hiệu quả:

Dành cho nhà phát triển front-end: Apidog + JWT Debugger + ModHeader

Trong quá trình phát triển front-end, việc xác minh request API và kiểm tra token thường xuyên cần thiết. Kết hợp này cho phép gửi request API, kiểm tra nội dung token và thay đổi header một cách dễ dàng.

Dành cho nhà phát triển back-end: Apidog + Burp Suite + curl/jq

Trong phát triển back-end, cần kiểm tra chi tiết hơn về luồng xác thực. Kết hợp này cho phép kiểm tra endpoint API, bắt và phân tích request, và tạo script kiểm tra tự động.

Mẹo triển khai kiểm tra xác thực trong đội phát triển

Đội của tôi tích hợp kiểm tra xác thực vào quy trình phát triển bằng các cách tiếp cận sau:

  1. Tạo bộ sưu tập kiểm tra chung: Tạo bộ sưu tập kiểm tra trong Apidog mà toàn đội có thể sử dụng, bao gồm các kịch bản kiểm tra xác thực cơ bản.

  2. Danh sách kiểm tra pull request: Bao gồm kiểm tra xác thực trong danh sách kiểm tra khi thêm endpoint API mới.

  3. Đánh giá bảo mật định kỳ: Hai tuần một lần, toàn đội thực hiện đánh giá mã liên quan đến xác thực.

  4. Thực thi kiểm tra tự động liên tục: Tích hợp kiểm tra xác thực vào pipeline CI/CD để đảm bảo các thay đổi mã không ảnh hưởng đến bảo mật.

Tóm tắt

Kiểm tra xác thực API không chỉ dành cho các chuyên gia bảo mật đặc biệt, mà là công việc quan trọng mà chúng ta, những nhà phát triển, nên thực hiện hàng ngày. Bản thân tôi, bằng cách biến kiểm tra xác thực thành thói quen, đã có thể phát triển các ứng dụng an toàn và đáng tin cậy hơn.

Các kết hợp đặc biệt được đề xuất:

  1. Công việc phát triển hàng ngày → Apidog + JWT Debugger
  2. Kiểm tra bảo mật chi tiết → Apidog + ModHeader
  3. Kiểm tra tự động → Jest/Mocha + curl

Cuối cùng, bảo mật không đủ với nỗ lực của một người. Tôi tin rằng bằng cách chia sẻ nhận thức trong toàn đội và thực hiện đánh giá mã lẫn nhau, chúng ta có thể tạo ra các ứng dụng mạnh mẽ hơn.


Tôi hy vọng bài viết này hữu ích cho công việc phát triển của bạn. Nếu bạn muốn biết thêm về các công cụ hoặc kỹ thuật kiểm tra khác, hãy cho tôi biết trong phần bình luận! Hãy cùng nhau học hỏi!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.