Posted on
Xác thực JWT khi nối hệ thống khóa học vào nội bộ
Xác thực JWT khi nối hệ thống khóa học vào nội bộ

Xác thực JWT API thường chỉ lộ vấn đề khi hệ thống nội bộ bắt đầu gọi dữ liệu khóa học. Mona.Academy, nền tảng SaaS bán khóa học online của The MONA Group, cấp JWT Bearer token sau khi đăng nhập. Chúng tôi xem token như thẻ vào cửa do hệ thống cấp cho một phiên làm việc.

Rắc rối thường không nằm ở việc gọi được API lần đầu. Nó xuất hiện khi token được lưu sai chỗ, dùng sai ngữ cảnh hoặc gắn với quyền quá rộng. Bài này đi thẳng vào ba điểm đội kỹ thuật cần chốt trước khi nối hai hệ thống.

Lấy token bằng mutation nào

Lấy token bằng mutation nào
Lấy token bằng mutation nào

Muốn kết nối chạy được, chúng tôi cần xác định đúng điểm bắt đầu. Với Mona.Academy, token được lấy sau khi đăng nhập bằng mutation generateCustomerToken.

Mutation là một lệnh trong GraphQL dùng để yêu cầu hệ thống thực hiện một thay đổi. Đây là thao tác gửi thông tin đăng nhập để nhận lại token. Endpoint là điểm tiếp nhận một yêu cầu API cụ thể.

Xác thực JWT API bắt đầu từ lần đăng nhập

Luồng nên được tách thành hai việc rõ ràng. Hệ nội bộ gọi generateCustomerToken để đăng nhập trước. Sau đó, JWT Bearer token nhận được mới được dùng cho những yêu cầu cần xác thực.

Bearer có thể hiểu là cơ chế dùng token đang cầm để chứng minh quyền truy cập. Vì vậy, chúng tôi không ghi token vào nội dung hiển thị cho người dùng. Đội kỹ thuật cũng không đặt token trong phần mô tả lỗi.

Tên mutation phải được giữ đúng từng ký tự. Chúng tôi thường đối chiếu cấu trúc yêu cầu và dữ liệu trả về tại Mona.Academy API. Bài viết này không tự đặt tên trường đăng nhập, vì dữ kiện được cấp không mô tả các trường đó.

Một cách làm dễ kiểm tra là dựng riêng lớp kết nối với nền tảng khóa học. Lớp này chịu trách nhiệm đăng nhập và chuyển token cho yêu cầu tiếp theo. Phần nghiệp vụ nội bộ chỉ gọi lớp kết nối, thay vì tự xử lý token ở nhiều nơi.

Cách tách đó cũng hữu ích khi doanh nghiệp mở rộng hệ thống. Chúng tôi từng gặp luồng tích hợp bị rối vì mỗi chức năng gọi API theo một kiểu. Góc nhìn về tích hợp AI vào phần mềm cũng cho thấy nhu cầu gom kết nối vào một lớp rõ trách nhiệm.

Chín điểm xác thực cần được gọi đúng việc

Nhóm Xác thực có chín endpoint. Con số này nói lên rằng đăng nhập chỉ là một phần của luồng tài khoản. Mỗi endpoint phục vụ một việc riêng, nên hệ nội bộ cần gọi đúng ngữ cảnh.

  • Đăng ký tạo luồng cho người dùng mới.
  • Đăng nhập là bước lấy JWT Bearer token.
  • Google OAuth phục vụ đăng nhập qua Google.
  • URL đăng nhập mạng xã hội cung cấp địa chỉ cho luồng tương ứng.
  • Quên mật khẩu mở đầu quá trình lấy lại quyền truy cập.
  • Xác thực OTP kiểm tra mã dùng một lần.
  • Đổi mật khẩu qua OTP xử lý mật khẩu trong luồng đó.
  • Thông tin khách hàng phục vụ việc đọc thông tin khách hàng.
  • Đăng xuất kết thúc luồng đăng nhập theo endpoint đã có.

OAuth là cơ chế cho phép dùng danh tính từ một dịch vụ khác để đăng nhập. OTP là mã xác thực dùng một lần. Hai khái niệm này gần nhau ở mục tiêu xác minh, nhưng chúng không phải cùng một thao tác.

Nếu người phụ trách đi từ trang chủ, đội kỹ thuật vẫn nên chuyển sang tài liệu API trước khi viết mã. Chúng tôi không dùng nội dung giới thiệu sản phẩm để đoán tên mutation hoặc endpoint. Cách đó dễ tạo ra kết nối chạy thử được nhưng khó bảo trì.

Vòng đời token và chỗ hay sai

Vòng đời token và chỗ hay sai
Vòng đời token và chỗ hay sai

Lấy được token mới chỉ giải quyết cửa vào. Phần dễ sai nằm ở cách hệ nội bộ giữ, dùng và loại token khỏi luồng làm việc.

Dữ kiện ở đây không nêu thời lượng hiệu lực của token. Chúng tôi vì thế không tự gắn một con số hết hạn. Đội triển khai cần đọc đúng phản hồi API và tài liệu được cung cấp, rồi mới đặt quy tắc xử lý.

Đừng biến token thành dữ liệu dùng chung

JWT Bearer token thuộc về luồng xác thực đã tạo ra nó. Chúng tôi tránh đặt một token cố định vào nhiều chức năng nội bộ. Khi quá nhiều phần cùng phụ thuộc vào một giá trị, việc tìm lỗi trở nên khó hơn.

Ví dụ, một màn hình quản trị cần gọi dữ liệu khóa học. Một tác vụ nền cũng cần kết nối cùng hệ thống. Chúng tôi cho cả hai đi qua lớp kết nối, nhưng vẫn tách ngữ cảnh sử dụng trong mã.

Người mới thường hỏi có nên lưu token thật lâu để đỡ đăng nhập lại. Chúng tôi không chốt theo cảm tính, vì thời lượng hiệu lực chưa được nêu. Quyết định lưu giữ phải bám vào tài liệu và yêu cầu bảo mật của chính hệ nội bộ.

Trong bản ghi lỗi, đội ngũ chỉ lưu trạng thái của bước xử lý. Token đầy đủ không cần xuất hiện ở đó. Nếu phải nhận diện một phiên để dò luồng, chúng tôi dùng mã nội bộ do hệ thống của mình quản lý.

Quy tắc này giữ ranh giới giữa dữ liệu xác thực và dữ liệu vận hành. Người xem nhật ký vẫn biết bước nào hỏng. Họ không cần nhìn thấy thẻ truy cập của phiên đang chạy.

Khi token không còn dùng được, luồng phải dừng đúng chỗ

Một lỗi phổ biến là hệ thống cứ gửi lại cùng token sau khi yêu cầu bị từ chối. Cách lặp đó không tạo thêm thông tin. Nó chỉ khiến nhật ký dài hơn và che mất nguyên nhân ban đầu.

xác thực JWT API
xác thực JWT API

Chúng tôi thường cho lớp kết nối nhận diện trạng thái không thể tiếp tục. Lớp này trả lỗi có nghĩa về hệ nội bộ. Người phụ trách sau đó biết đây là lỗi xác thực, thay vì nhầm với lỗi nghiệp vụ khóa học.

Trong chín endpoint được cấp, không có endpoint làm mới token được nêu. Vì thế, bài viết không giả định một luồng làm mới riêng. Nếu tài liệu dự án có hướng dẫn khác, đội triển khai phải bám đúng hướng dẫn đó.

Đặt đăng xuất vào đúng luồng

Endpoint đăng xuất cũng cần được đặt vào đúng luồng. Khi người dùng chủ động đăng xuất, hệ nội bộ nên gọi thao tác tương ứng rồi bỏ token đang giữ. Đây là cách đóng phiên rõ ràng về mặt thiết kế.

Quên mật khẩu, xác thực OTP và đổi mật khẩu qua OTP là ba thao tác khác nhau. Chúng tôi không gộp chúng thành một nút xử lý chung. Mỗi bước nên báo đúng trạng thái để người dùng hiểu họ đang ở đâu.

Các tình huống kết nối thường thay đổi khi phần mềm có thêm chức năng. Đội kỹ thuật có thể tham khảo kho bài viết công nghệ để đặt vấn đề tích hợp trong bối cảnh rộng hơn. Riêng thông số của Mona.Academy vẫn phải theo tài liệu của nền tảng.

Phân quyền phía hệ nội bộ

Phân quyền phía hệ nội bộ
Phân quyền phía hệ nội bộ

Xác thực trả lời câu hỏi phiên làm việc có được hệ thống nhận hay không. Phân quyền trả lời câu hỏi người đó được làm gì trong phần mềm nội bộ.

Hai việc liên quan chặt chẽ, nhưng đội ngũ không nên trộn chúng vào một đoạn mã. Nếu trộn, lỗi token có thể bị hiển thị như lỗi thiếu quyền. Người vận hành khi đó khó biết cần xử lý tài khoản hay quy tắc nội bộ.

Token không thay cho quy tắc nghiệp vụ

Dữ kiện được cấp chỉ xác nhận Mona.Academy dùng JWT Bearer token sau đăng nhập. Nó không mô tả vai trò nội bộ hoặc cấu trúc quyền trong token. Chúng tôi vì thế không tự dựng tên quyền rồi gán cho nền tảng.

Hệ nội bộ nên giữ bảng quy tắc của riêng mình. Bảng này có thể trả lời chức năng nào được mở cho từng nhóm người dùng. Đây là quyết định nghiệp vụ của doanh nghiệp, không phải tên một tính năng được suy ra từ token.

Endpoint thông tin khách hàng giúp đội kỹ thuật đặt đúng điểm kiểm tra danh tính theo tài liệu. Sau khi có danh tính cần thiết, hệ nội bộ mới đối chiếu với quy tắc quyền của mình. Chúng tôi tránh dùng một giá trị chưa được mô tả để quyết định quyền.

Giả sử một nhân viên chỉ cần xem thông tin phục vụ chăm sóc khách hàng. Hệ nội bộ không nên mở luôn chức năng quản trị chỉ vì phiên đã xác thực. Được nhận diện và được cấp quyền là hai tầng kiểm tra khác nhau.

Cách phân tầng càng cần thiết khi API được gọi bởi quy trình tự động. Với một AI agent trong chăm sóc khách hàng B2B, ngữ cảnh khách hàng phải đi cùng giới hạn quyền rõ ràng. Token không nên trở thành đường tắt bỏ qua quy tắc nội bộ.

Một luồng kiểm tra dễ đọc hơn một mớ điều kiện

Chúng tôi thường đọc luồng phân quyền từ ngoài vào trong. Trước tiên, lớp kết nối kiểm tra trạng thái xác thực. Kế tiếp, hệ nội bộ nhận diện tài khoản phù hợp với dữ liệu nó quản lý.

Sau đó, lớp nghiệp vụ mới kiểm tra thao tác được phép. Nếu bị từ chối, thông báo cần nói đúng tầng gặp lỗi. Cách viết này giúp người vận hành không phải đọc mã nguồn để phân biệt hai vấn đề.

Một tình huống dễ gặp là tài khoản đăng nhập thành công nhưng chưa được gán quyền nội bộ. Hệ thống nên dừng ở bước phân quyền. Nó không nên quay lại gọi generateCustomerToken như thể đăng nhập đã hỏng.

Khi xác thực JWT API không thành công

Chiều ngược lại cũng cần rõ. Nếu xác thực JWT không thành công, hệ nội bộ chưa có cơ sở đi tiếp tới kiểm tra nghiệp vụ. Việc dừng sớm giúp lỗi được đặt đúng chỗ và tránh những yêu cầu thừa.

Đội triển khai cũng nên dùng cùng một cách gọi trạng thái trên màn hình và trong nhật ký. Một bên ghi lỗi xác thực, bên kia ghi thiếu quyền sẽ khiến người hỗ trợ đi sai hướng. Ngôn ngữ rõ ràng giúp giảm thời gian dò luồng.

Trước khi đưa kết nối vào vận hành, chúng tôi khuyên đội kỹ thuật rà lại ba ranh giới: nơi lấy token, nơi giữ token và nơi quyết định quyền. Mỗi ranh giới cần một trách nhiệm riêng. Cách làm này giữ phần tích hợp dễ đọc khi nghiệp vụ phát triển.

Với Mona.Academy, điểm bắt đầu vẫn là generateCustomerToken và JWT Bearer token nhận sau đăng nhập. Hãy kiểm tra tài liệu API trước khi chốt mã, rồi để hệ nội bộ tự quản lý quyền của mình. Đó là nền móng gọn và dễ kiểm soát cho kết nối lâu dài.