Bối cảnh: Tôi đã viết ngăn xếp máy khách và máy chủ cho OAuth 1.0a và 2.0.
Cả OAuth 1.0a & 2.0 đều hỗ trợ xác thực hai chân , trong đó máy chủ được đảm bảo về danh tính người dùng và xác thực ba chân , trong đó máy chủ được đảm bảo bởi nhà cung cấp nội dung về danh tính người dùng. Xác thực ba chân là nơi các yêu cầu ủy quyền và mã thông báo truy cập xuất hiện và điều quan trọng cần lưu ý là OAuth 1 cũng có những yêu cầu đó.
Một phức tạp: xác thực ba chân
Điểm chính của thông số kỹ thuật OAuth là dành cho nhà cung cấp nội dung (ví dụ: Facebook, Twitter, v.v.) để đảm bảo máy chủ (ví dụ: ứng dụng Web muốn nói chuyện với nhà cung cấp nội dung thay mặt khách hàng) rằng khách hàng có một số nhận dạng . Những gì xác thực ba chân cung cấp là khả năng thực hiện điều đó mà không cần máy khách hoặc máy chủ cần biết chi tiết về danh tính đó (ví dụ: tên người dùng và mật khẩu).
Không có (?) Nhận được quá sâu vào các chi tiết của OAuth:
- Máy khách gửi yêu cầu ủy quyền đến máy chủ, xác nhận rằng máy khách là máy khách hợp pháp của dịch vụ.
- Máy chủ chuyển hướng khách hàng đến nhà cung cấp nội dung để yêu cầu quyền truy cập vào tài nguyên của nó.
- Nhà cung cấp nội dung xác thực danh tính người dùng và thường yêu cầu sự cho phép của họ để truy cập tài nguyên.
- Nhà cung cấp nội dung chuyển hướng khách hàng trở lại máy chủ, thông báo về việc thành công hay thất bại. Yêu cầu này bao gồm mã ủy quyền thành công.
- Máy chủ đưa ra yêu cầu ngoài băng cho nhà cung cấp nội dung và trao đổi mã ủy quyền để lấy mã thông báo truy cập.
Giờ đây, máy chủ có thể thực hiện các yêu cầu cho nhà cung cấp nội dung thay mặt cho người dùng bằng cách chuyển mã thông báo truy cập.
Mỗi trao đổi (client-> máy chủ, máy chủ-> nhà cung cấp nội dung) bao gồm xác thực một bí mật được chia sẻ, nhưng vì OAuth 1 có thể chạy qua một kết nối không được mã hóa, mỗi xác thực không thể truyền bí mật qua dây.
Điều đó đã được thực hiện, như bạn đã lưu ý, với HMAC. Máy khách sử dụng bí mật mà nó chia sẻ với máy chủ để ký các đối số cho yêu cầu ủy quyền của nó. Máy chủ lấy các đối số, ký chính chúng bằng khóa của máy khách và có thể xem liệu đó có phải là máy khách hợp pháp không (ở bước 1 ở trên).
Chữ ký này yêu cầu cả máy khách và máy chủ đồng ý về thứ tự của các đối số (vì vậy chúng ký chính xác cùng một chuỗi) và một trong những phàn nàn chính về OAuth 1 là nó yêu cầu cả máy chủ và máy khách sắp xếp và ký nhận dạng. Đây là mã khó sử dụng và nó đúng hoặc bạn nhận được 401 Unauthorized
với sự giúp đỡ nhỏ. Điều này làm tăng rào cản để viết một khách hàng.
Bằng cách yêu cầu ủy quyền yêu cầu chạy qua SSL, OAuth 2.0 loại bỏ nhu cầu sắp xếp đối số và ký hoàn toàn. Máy khách chuyển bí mật của nó đến máy chủ, xác nhận nó trực tiếp.
Các yêu cầu tương tự cũng xuất hiện trong kết nối máy chủ-> nhà cung cấp nội dung và vì SSL đó loại bỏ một rào cản đối với việc viết một máy chủ truy cập các dịch vụ OAuth.
Điều đó làm cho mọi thứ dễ dàng hơn nhiều trong các bước 1, 2 và 5 ở trên.
Vì vậy, tại thời điểm này, máy chủ của chúng tôi có mã thông báo truy cập vĩnh viễn là tên người dùng / mật khẩu tương đương với người dùng. Nó có thể thực hiện các yêu cầu cho nhà cung cấp nội dung thay mặt cho người dùng bằng cách chuyển mã thông báo truy cập đó như một phần của yêu cầu (dưới dạng đối số truy vấn, tiêu đề HTTP hoặc dữ liệu biểu mẫu POST).
Nếu dịch vụ nội dung chỉ được truy cập qua SSL, chúng tôi đã hoàn thành. Nếu nó có sẵn thông qua HTTP đơn giản, chúng tôi muốn bảo vệ mã thông báo truy cập vĩnh viễn đó theo một cách nào đó. Bất cứ ai đánh hơi được kết nối sẽ có thể có quyền truy cập vào nội dung của người dùng mãi mãi.
Cách giải quyết trong OAuth 2 là với mã thông báo làm mới . Mã thông báo làm mới trở thành mật khẩu vĩnh viễn tương đương và nó chỉ được truyền qua SSL . Khi máy chủ cần quyền truy cập vào dịch vụ nội dung, nó sẽ trao đổi mã thông báo làm mới cho mã thông báo truy cập ngắn hạn. Bằng cách đó, tất cả các truy cập HTTP có thể đánh hơi được thực hiện bằng mã thông báo sẽ hết hạn. Google đang sử dụng hết hạn 5 phút trên API OAuth 2 của họ.
Vì vậy, ngoài các mã thông báo làm mới, OAuth 2 đơn giản hóa tất cả các giao tiếp giữa máy khách, máy chủ và nhà cung cấp nội dung. Và mã thông báo làm mới chỉ tồn tại để cung cấp bảo mật khi nội dung đang được truy cập không được mã hóa.
Xác thực hai chân
Tuy nhiên, đôi khi, một máy chủ chỉ cần kiểm soát quyền truy cập vào nội dung của chính nó. Xác thực hai chân cho phép khách hàng xác thực người dùng trực tiếp với máy chủ.
OAuth 2 tiêu chuẩn hóa một số phần mở rộng cho OAuth 1 được sử dụng rộng rãi. Người mà tôi biết rõ nhất được Twitter giới thiệu là xAuth . Bạn có thể thấy nó trong OAuth 2 dưới dạng Thông tin mật khẩu của chủ sở hữu tài nguyên .
Về cơ bản, nếu bạn có thể tin tưởng khách hàng với thông tin đăng nhập của người dùng (tên người dùng và mật khẩu), họ có thể trao đổi trực tiếp những thông tin đó với nhà cung cấp nội dung để lấy mã thông báo truy cập. Điều này làm cho OAuth hữu ích hơn nhiều trên các ứng dụng di động - với xác thực ba chân, bạn phải nhúng chế độ xem HTTP để xử lý quy trình ủy quyền với máy chủ nội dung.
Với OAuth 1, đây không phải là một phần của tiêu chuẩn chính thức và yêu cầu quy trình ký giống như tất cả các yêu cầu khác.
Tôi vừa triển khai phía máy chủ của OAuth 2 với Thông tin mật khẩu của chủ sở hữu tài nguyên và từ góc độ của khách hàng, việc nhận mã thông báo truy cập đã trở nên đơn giản: yêu cầu mã thông báo truy cập từ máy chủ, chuyển id / bí mật của máy khách làm tiêu đề ủy quyền HTTP và đăng nhập / mật khẩu của người dùng dưới dạng dữ liệu.
Ưu điểm: Đơn giản
Vì vậy, từ quan điểm của người triển khai, những lợi thế chính tôi thấy trong OAuth 2 là giảm độ phức tạp. Nó không yêu cầu thủ tục ký yêu cầu, điều này không thực sự khó khăn nhưng chắc chắn là khó khăn. Nó làm giảm đáng kể công việc cần thiết để hoạt động như một khách hàng của một dịch vụ, đó là nơi (trong thế giới di động hiện đại) mà bạn muốn giảm thiểu đau đớn nhất. Sự phức tạp giảm trên máy chủ-> nhà cung cấp nội dung kết thúc làm cho nó có khả năng mở rộng hơn trong trung tâm dữ liệu.
Và nó mã hóa thành một số phần mở rộng tiêu chuẩn thành OAuth 1.0a (như xAuth) hiện đang được sử dụng rộng rãi.