Làm cách nào để xác thực mã thông báo truy cập OAuth 2.0 cho máy chủ tài nguyên?


147

Khi khách hàng yêu cầu máy chủ tài nguyên nhận tài nguyên được bảo vệ bằng mã thông báo truy cập OAuth 2.0, máy chủ này xác thực mã thông báo như thế nào? Giao thức mã thông báo làm mới OAuth 2.0?


Máy chủ được cho là có thể xác thực mã thông báo mà nó đã phát hành trước đó ... Thông thường, đây sẽ là một tra cứu cơ sở dữ liệu hoặc tiền điện tử (mã thông báo tự ký).
Thilo

Tôi hiểu rồi. Còn về trường hợp này, WS của chủ sở hữu tài nguyên và WS của máy khách đều nằm trên các thiết bị khác nhau thì sao?
Ack

5
Bạn có nghĩa là dịch vụ xác thực và dịch vụ tài nguyên? (khách hàng / người tiêu dùng sẽ luôn ở trên một thiết bị khác và không thể tự xác thực mã thông báo) Nếu đó là trường hợp, bạn có thể sử dụng mã thông báo làm mới "đắt tiền" để kiểm tra (chỉ máy chủ xác thực mới có thể làm điều đó) nhưng tồn tại lâu và mã thông báo truy cập hết hạn thường xuyên và có thể được kiểm tra ngoại tuyến.
Thilo

Câu trả lời:


97

Cập nhật tháng 11 năm 2015: Theo Hans Z. bên dưới - đây thực sự được xác định là một phần của RFC 7662 .

Câu trả lời gốc: Thông số OAuth 2.0 ( RFC 6749 ) không xác định rõ ràng sự tương tác giữa Máy chủ tài nguyên (RS) và Máy chủ ủy quyền (AS) để xác thực mã thông báo truy cập (AT). Nó thực sự phụ thuộc vào định dạng / chiến lược mã thông báo của AS - một số mã thông báo độc lập (như Mã thông báo Web JSON ) trong khi các mã thông báo khác có thể tương tự như cookie phiên trong đó chúng chỉ tham chiếu thông tin được giữ ở phía máy chủ tại AS.

Đã có một số cuộc thảo luận trong Nhóm làm việc OAuth về việc tạo ra một cách tiêu chuẩn để RS giao tiếp với AS để xác thực AT. Công ty của tôi (Ping Identity) đã đưa ra một cách tiếp cận như vậy cho OAuth thương mại của chúng tôi AS (PingFederate): https://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn1564003025072__section_N10578_N1002A_N10001 . Nó sử dụng tương tác dựa trên REST cho điều này rất bổ sung cho OAuth 2.0.


Scott T, Có cách nào để xem một mẫu mã về cách sử dụng tính năng này trong Ping Fed Cả không?
JavaHead

2
@JavaHead có một số chi tiết giao thức hơn bao phủ trên trang web của chúng tôi phát triển web ở đây: developer.pingidentity.com/en/resources/... , các tàu PingFederate OAuth Sân chơi như một tập hợp các JSP có thể được tham chiếu như là mã nguồn cho việc chứng thực thẻ. Nó (và các thư viện và mẫu mã nguồn mở khác) có thể được tải xuống từ đây: developer.pingidentity.com/en/code.html
Scott T.

Scott, tôi đang tìm một mẫu chứng minh Cấp chứng chỉ khách hàng với API nghỉ được bảo vệ bởi Máy chủ tài nguyên cục bộ và PingFed Cả dưới dạng Máy chủ xác thực. Sau đó, máy chủ tài nguyên cục bộ sẽ gọi điểm cuối xác nhận. Bạn đã đi qua bất cứ điều gì như vậy?
JavaHead

@JavaHead một lần nữa đó là thứ bạn nên có thể tham khảo Sân chơi OAuth PingFed Cả cho. Nó thể hiện cả Loại cấp thông tin xác thực của khách hàng và xác thực mã thông báo truy cập của máy chủ tài nguyên.
Scott T.

Trong trường hợp mã thông báo truy cập JWT, tôi cho rằng bạn thường không muốn đạt điểm cuối nội quan AS cho mọi yêu cầu đến RS. Trong trường hợp nào, kiểm tra RS về chữ ký mã thông báo và phạm vi có đủ không? Hoặc, có lẽ RS có thể lưu trữ các phản hồi nội tâm từ AS trong một khoảng thời gian?
Gary

119

Cách Google

Xác thực mã thông báo Oauth2 của Google

Yêu cầu:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg

Trả lời:

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email",
  "expires_in":436
} 

Cách của Microsoft

Microsoft - Oauth2 kiểm tra ủy quyền

Cách thức của Github

Github - Oauth2 kiểm tra ủy quyền

Yêu cầu:

GET /applications/:client_id/tokens/:access_token

Trả lời:

{
  "id": 1,
  "url": "https://api.github.com/authorizations/1",
  "scopes": [
    "public_repo"
  ],
  "token": "abc123",
  "app": {
    "url": "http://my-github-app.com",
    "name": "my github app",
    "client_id": "abcde12345fghij67890"
  },
  "note": "optional note",
  "note_url": "http://optional/note/url",
  "updated_at": "2011-09-06T20:39:23Z",
  "created_at": "2011-09-06T17:26:27Z",
  "user": {
    "login": "octocat",
    "id": 1,
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "somehexcode",
    "url": "https://api.github.com/users/octocat"
  }
}

Cách Amazon

Đăng nhập bằng Amazon - Hướng dẫn dành cho nhà phát triển (tháng 12 năm 2015, trang 21)

Yêu cầu :

https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

Phản ứng :

HTTP/l.l 200 OK
Date: Fri, 3l May 20l3 23:22:l0 GMT 
x-amzn-RequestId: eb5be423-ca48-lle2-84ad-5775f45l4b09 
Content-Type: application/json 
Content-Length: 247 

{ 
  "iss":"https://www.amazon.com", 
  "user_id": "amznl.account.K2LI23KL2LK2", 
  "aud": "amznl.oa2-client.ASFWDFBRN", 
  "app_id": "amznl.application.436457DFHDH", 
  "exp": 3597, 
  "iat": l3ll280970
}

2
@gustavodiazjaimes Nó không giải thích gì cả về cách phía máy chủ nhận ra id người dùng được gán từ mã thông báo.
dùng2284570

22
Tôi không hiểu tất cả các phiếu bầu. Điều này không xuất hiện để trả lời câu hỏi.
Duncan Jones

Có ai biết nếu Azure Active Directory có điểm cuối tương tự để kiểm tra xem mã thông báo đã phát hành có hợp lệ không?
dùng180940

2
Nói cách khác, cuộn của riêng bạn.
AndroidDev

51

Một bản cập nhật về câu trả lời của @Scott T .: giao diện giữa Máy chủ tài nguyên và Máy chủ ủy quyền để xác thực mã thông báo đã được chuẩn hóa trong IETF RFC 7662 vào tháng 10 năm 2015, xem: https://tools.ietf.org/html/rfc7662 . Một cuộc gọi xác nhận mẫu sẽ trông như sau:

POST /introspect HTTP/1.1
Host: server.example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 23410913-abewfq.123483

token=2YotnFZFEjr1zCsicMWpAA

và một câu trả lời mẫu:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "active": true,
  "client_id": "l238j323ds-23ij4",
  "username": "jdoe",
  "scope": "read write dolphin",
  "sub": "Z5O3upPC88QrAjx00dis",
  "aud": "https://protected.example.net/resource",
  "iss": "https://server.example.com/",
  "exp": 1419356238,
  "iat": 1419350238,
  "extension_field": "twenty-seven"
}

Tất nhiên việc áp dụng bởi các nhà cung cấp và sản phẩm sẽ phải xảy ra theo thời gian.


Nếu sử dụng OoenId Connect, chúng tôi không nên sử dụng mã thông báo id để xác thực mã thông báo truy cập: openid.net/specs/iêu
adnan kamili

1
@Renan: phù hợp với cách yêu cầu phạm vi trong yêu cầu ủy quyền, với scopetham số truy vấn có giá trị chứa danh sách phạm vi được phân tách bằng dấu cách
Hans Z.

4
Vui lòng không sử dụng từ "tiêu chuẩn hóa" khi một cái gì đó chưa chính thức được chấp nhận bởi một cơ quan quản lý. IETF RFC 7662 kể từ tháng 2 năm 2018 chỉ rõ rằng đó là một "đề xuất".
AndroidDev

1
@adnankamili Không có thứ gọi là "đề xuất". Vào thời điểm một tài liệu trở thành RFC, nó đã là một "tiêu chuẩn được đề xuất" mang trọng lượng đáng kể đằng sau nó. Bản thân OAuth 2.0 vẫn là một "tiêu chuẩn được đề xuất" vì vậy tôi không chắc bạn đang cố gắng thực hiện điểm nào.
Pace

15

Thông số OAuth 2.0 không xác định phần. Nhưng có thể có một vài lựa chọn:

  1. Khi máy chủ tài nguyên nhận được mã thông báo trong Tiêu đề Authz thì nó sẽ gọi API xác thực / introspect trên máy chủ Authz để xác thực mã thông báo. Ở đây, máy chủ Authz có thể xác thực nó bằng cách sử dụng DB Store hoặc xác minh chữ ký và các thuộc tính nhất định. Là một phần của phản hồi, nó giải mã mã thông báo và gửi dữ liệu thực tế của mã thông báo cùng với thời gian hết hạn còn lại.

  2. Máy chủ Authz có thể mã hóa / ký mã thông báo bằng khóa riêng và sau đó có thể cung cấp khóa công khai / chứng chỉ cho Máy chủ tài nguyên. Khi máy chủ tài nguyên nhận được mã thông báo, nó sẽ giải mã / xác minh chữ ký để xác minh mã thông báo. Đưa nội dung ra và xử lý mã thông báo. Sau đó, nó có thể cung cấp quyền truy cập hoặc từ chối.


8

Thông số kỹ thuật OAuth v2 chỉ ra:

Các thuộc tính mã thông báo truy cập và các phương thức được sử dụng để truy cập các tài nguyên được bảo vệ nằm ngoài phạm vi của thông số kỹ thuật này và được xác định bởi các thông số kỹ thuật đồng hành.

Máy chủ ủy quyền của tôi có điểm cuối dịch vụ web (SOAP) cho phép Máy chủ tài nguyên biết liệu access_token có hợp lệ hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.