Tôi sẽ giải thích một chút về điều này, bởi vì đó là một câu hỏi hay, và có rất nhiều sự nhầm lẫn xung quanh nó - vì vậy hãy để tôi ở đây.
Nếu API bạn đang cố gắng bảo vệ sẽ được sử dụng độc quyền bởi các cá nhân cho ứng dụng phía máy chủ và không phải nhà phát triển bên thứ ba, tôi rất muốn giới thiệu bạn sử dụng Xác thực cơ bản HTTP để bảo mật dịch vụ API của bạn .
Cách làm việc này là siêu thẳng về phía trước:
- Đối với người dùng của bạn (s), tạo ra API cặp Key (s) mà bao gồm một ID và Secret. Khóa API đồng nghĩa với tên người dùng/mật khẩu. Chỉ cần tạo các giá trị ID/Bí mật ngẫu nhiên bằng cách sử dụng thư viện UUID.
Khi bạn xác thực dựa vào dịch vụ API của mình, hãy cung cấp các thông tin đăng nhập API đó trong tiêu đề Cấp quyền HTTP để tự xác định.Đây là cách có vẻ sử dụng curl
:
$ curl --user my-api-keyid:
gì tuyệt vời về cơ bản Auth đó là
- Nó rất đơn giản để thực hiện.
- Đó là một tiêu chuẩn được xác định rõ.
- Miễn là bạn đang đưa ra yêu cầu qua HTTPS và bạn không công bố khóa API của mình, bạn nên an toàn.
Bây giờ - nếu bạn đang xây dựng dịch vụ API nơi bạn muốn xác thực người dùng từ nhiều môi trường khác nhau (không chỉ ứng dụng phía máy chủ), bạn thực sự cần sử dụng giao thức OAuth2.
Đây là nội dung được thiết kế cho.
Giao thức OAuth2 có thể xác thực người dùng theo nhiều cách - nhưng kết quả là khá phức tạp. Thêm OAuth để trang web của bạn có thể là một thách thức, thậm chí nếu bạn đang sử dụng các thư viện phổ biến/vv
Sau đây là cách OAuth hoạt động (một sự cố nhanh chóng):
Password Grant
Password luồng trong OAuth là nơi bạn trao đổi tên người dùng/mật khẩu cho Mã thông báo truy cập (thường là một JWT). Sau đó, bạn sử dụng Mã thông báo truy cập trong tiêu đề Cấp quyền HTTP để xác định chính mình với dịch vụ API của bạn.
Đây là những gì hầu hết mọi người làm khi xây dựng SPA với Angular/React, cũng như các ứng dụng dành cho thiết bị di động.
Các Credentials Khách hàng Grant
The Client Credentials chảy là nơi bạn trao đổi một khóa API (giống như auth cơ bản) cho một Access Token. Sau đó, bạn sử dụng Mã thông báo truy cập trong tiêu đề Cấp quyền HTTP để xác định chính mình với dịch vụ API của bạn.
Đây là những gì mọi người làm khi xây dựng các ứng dụng phía máy chủ với OAuth.
Các Grant Implicit
dòng chảy Đây là những gì bạn nhìn thấy khi bạn đăng nhập vào một số vị trí như Facebook. Bạn nhấp vào một nút, được chuyển hướng đến một số trang web khác để xác thực/chấp nhận quyền và cuối cùng bạn được trả lại trang web chính bằng Mã thông báo xác thực mà bạn sử dụng để nhận diện chính mình. Điều này là không lý tưởng cho các dịch vụ API.
Các Authorization Mã Grant
dòng này hoàn toàn giống với dòng chảy ngầm, ngoại trừ bạn có được trở lại một mã số cho phép mà bạn sau đó đổi lấy một access token mà bạn sử dụng để xác định chính mình. Điều này là không lý tưởng cho các dịch vụ API. Nó an toàn hơn một chút.
Nếu bạn dự định đi với OAuth vì trường hợp sử dụng của bạn, tôi khuyên bạn nên kiểm tra nhà cung cấp xác thực như Stormpath.Chúng tự động hóa rất nhiều thứ này và giải quyết rất nhiều sự phức tạp xung quanh OAuth.
Nếu không, hãy cho phép Xác thực cơ bản!
Tôi rất xin lỗi vì phản hồi muộn của tôi. Đề xuất của bạn là tuyệt vời và tôi chưa bao giờ nghĩ một ý tưởng tuyệt vời như vậy. Cuối cùng tôi đã chọn loại cấp mật khẩu vì tôi cũng phải triển khai ứng dụng dành cho thiết bị di động của riêng mình. (chúng tôi sẽ cung cấp các API của chúng tôi cho các nhà phát triển ứng dụng dành cho thiết bị di động bên thứ 3) Và thậm chí, OAuth là ver y phức tạp nhưng tôi có thể tìm thấy một số thư viện. Điều này cũng tốt cho tôi. Sử dụng auth cơ bản có thể cần thực hiện tùy chỉnh, không chắc chắn nhưng cũng giống như tạo bảng để lưu khóa và bí mật được tạo. – zono
Cảm ơn bạn đã giải thích, tôi có một số câu hỏi về việc cấp mật khẩu. Tôi đã xây dựng một máy chủ ủy quyền bảo mật oauth/token với một xác thực cơ bản cần client_id và client_secret để chấp nhận các yêu cầu. Nhưng làm thế nào tôi có thể bảo vệ client_secret? Ứng dụng khách là ứng dụng Angular 2. Bạn cần phải bảo đảm urê oauth/token bằng Xác thực cơ bản? – Paolo