2014-09-10 16 views
10

Tôi đang tìm hiểu OAuth 2.0 và không thể nhận được cách bảo mật mã thông báo truy cập trong số lưu lượng cấp phép tiềm ẩn. Có một số đề tài trong đặc điểm kỹ thuật và một số câu trả lời SO upvoted tìm kiếm mâu thuẫn với nhau. Ai đó có thể xóa nó? Trích dẫn từ các câu trả lời và đặc điểm kỹ thuật SO gây nhầm lẫn cho tôi:Bảo mật dựa trên mảng băm chính xác hoạt động như thế nào?

  1. (Từ spec) URI chuyển hướng được sử dụng để gửi mã thông báo truy cập cho khách hàng. Mã thông báo truy cập có thể được hiển thị với chủ sở hữu tài nguyên hoặc ứng dụng khác có quyền truy cập vào tác nhân người dùng của chủ sở hữu tài nguyên.
  2. (Từ spec) Tiếp cận thông tin thẻ (cũng như bất kỳ truy cập bảo mật thẻ thuộc tính) PHẢI được giữ bí mật trên đường vận chuyển và lưu trữ, và chỉ chia sẻ giữa các máy chủ ủy quyền, các máy chủ tài nguyên access token có giá trị, và khách hàng mà mã thông báo truy cập được phát hành . Thông tin xác thực mã thông báo truy cập PHẢI chỉ được truyền bằng TLS.
  3. (Từ accepted and upvoted SO answer) Trong luồng ngầm, mã thông báo truy cập được chuyển thành một đoạn băm, chỉ các trình duyệt mới biết được đoạn mã băm. Trình duyệt sẽ chuyển đoạn băm trực tiếp đến trang đích/URI chuyển hướng là trang web của khách hàng (đoạn băm không phải là một phần của yêu cầu HTTP) vì vậy bạn phải đọc đoạn băm bằng Javascript. Đoạn mã băm không thể bị chặn bởi các máy chủ/bộ định tuyến trung gian (điều này là quan trọng).

Câu hỏi của tôi:

P1 nói token giao cho khách hàng thông qua Redirection URI và P2 nói kênh phân phối phải được TLS-ed. Nhưng P3 nói rằng đoạn băm không gửi đến mạng. Mã truy cập đến khách hàng như thế nào nếu nó không gửi bởi vì đó là đoạn băm? Dù sao, nó phải được sended bởi mạng phải không? Hoặc gửi token với URI chuyển hướng làm cho một số ma thuật mà không có giao dịch mạng?

Giải thích duy nhất có thể xảy ra - trong trình duyệt mui xe chỉ gửi phần không băm của url theo mạng và sau khi tải trang mới, chỉ cần chèn đoạn băm và làm cho nó có sẵn cho JS. Nếu tôi đúng, tôi vẫn không thể hiểu tại sao chúng tôi không chỉ gửi mã thông báo với kênh HTTPS đáng tin cậy, bảo mật làm thông số phản hồi?

Trả lời

8

Nhà cung cấp OAuth gửi access token trở lại người dùng OAuth với một chuyển hướng HTTP Response:

HTTP/1.1 302 Found 
Location: https://consumer.org/redirect_uri#access_token=1111-2222-3333-4444 

Lưu ý cách thức thẻ truy cập được gửi qua mạng, như một phần của phản ứng HTTP từ các nhà cung cấp OAuth , C ALNG C shouldNG nên có trên HTTPS ngoài người tiêu dùng.

Trình duyệt của bạn sau đó sẽ thực hiện một yêu cầu HTTP GET mới cho thiết bị đầu cuối của người tiêu dùng:

GET /redirect_uri HTTP/1.1 
Host: consumer.org 

Lưu ý cách thức thẻ truy cập không được gửi đến người tiêu dùng thông qua mạng. Máy chủ tại consumer.org sẽ không nhận được mã thông báo trong yêu cầu HTTP này. Thay vào đó, trang web được trả lại từ https://consumer.org/redirect_uri sẽ chứa javascript có thể và sẽ đọc mã thông báo truy cập từ đoạn url. Do đó, bạn cần tin tưởng mã javascript mà bạn nhận được từ consumer.org (bằng cách sử dụng HTTPS) bởi vì nếu kẻ tấn công có thể tiêm mã, nó cũng có thể lấy mã thông báo truy cập (và gửi nó ở bất kỳ đâu gián tiếp).

Ví dụ về phản ứng HTTP từ người tiêu dùng:

200 OK 
Content-Type: text/html 

<html><head><script> 
    alert(window.location.hash) 
</script> 
</head><body></body></html> 
+0

về mã JS phần mềm độc hại và HTTPS - vâng, có lẽ HTTPS cài đặt trên máy khách giải quyết vấn đề JS xấu nhưng kỳ diệu không băm-đoạn phát minh ra cho phi HTTPS khách hàng ? Nếu hash-fragment không thể bảo vệ hoàn toàn khỏi các cuộc tấn công như JS xấu thì tốt hơn không chỉ đơn giản là sử dụng HTTPS trên máy khách và gửi token như tham số yêu cầu? – Baurzhan

+0

Không, lưu lượng tài trợ tiềm ẩn không dành cho khách hàng không phải https, nó dành cho khách hàng không có chương trình phụ trợ. Không có luồng nào có mã thông báo được gửi dưới dạng tham số yêu cầu. Ngược lại với luồng cấp phép tiềm ẩn, luồng mã ủy quyền, cung cấp 'code' như một tham số chuỗi truy vấn tới phần cuối của trình khách. Chương trình phụ trợ của khách hàng sau đó trao đổi mã với một mã thông báo (yêu cầu được xác thực với các chứng chỉ ứng dụng khách) –

Các vấn đề liên quan