วิธีการตรวจสอบโทเค็นการเข้าถึง OAuth 2.0 สำหรับเซิร์ฟเวอร์ทรัพยากร


147

เมื่อลูกค้าขอให้เซิร์ฟเวอร์ทรัพยากรรับทรัพยากรที่มีการป้องกันด้วยโทเค็นการเข้าถึง OAuth 2.0 เซิร์ฟเวอร์นี้จะตรวจสอบโทเค็นอย่างไร โปรโตคอลโทเค็นการรีเฟรช OAuth 2.0 หรือไม่


เซิร์ฟเวอร์ควรจะสามารถตรวจสอบโทเค็นที่ออกมาก่อนหน้านี้ได้ ... โดยปกติจะเป็นการค้นหาฐานข้อมูลหรือ crypto (โทเค็นที่ลงชื่อด้วยตนเอง)
Thilo

ฉันเห็น. ในกรณีนี้เจ้าของทรัพยากร WS และลูกค้า WS ทั้งคู่ต่างอุปกรณ์กันอย่างไร
แอ๊

5
คุณหมายถึงบริการการรับรองความถูกต้องและบริการทรัพยากรหรือไม่ (ลูกค้า / ผู้บริโภคมักจะอยู่ในอุปกรณ์ที่แตกต่างกันและไม่สามารถตรวจสอบโทเค็นตัวเองได้) หากเป็นกรณีนี้คุณสามารถใช้โทเค็นรีเฟรชที่ "แพง" เพื่อตรวจสอบ (เซิร์ฟเวอร์รับรองความถูกต้องเท่านั้นที่สามารถทำได้) เข้าถึงโทเค็นที่หมดอายุบ่อยและสามารถตรวจสอบออฟไลน์ได้
Thilo

คำตอบ:


97

ปรับปรุงพฤศจิกายน 2015:เป็นต่อฮันส์ซีด้านล่าง - นี่คือตอนที่กำหนดไว้แน่นอนเป็นส่วนหนึ่งของRFC 7662

คำตอบเดิม:ข้อมูลจำเพาะ OAuth 2.0 ( RFC 6749 ) ไม่ได้ระบุการโต้ตอบอย่างชัดเจนระหว่าง Resource Server (RS) และเซิร์ฟเวอร์การอนุญาต (AS) สำหรับการตรวจสอบการเข้าถึงโทเค็น (AT) มันขึ้นอยู่กับรูปแบบ / กลยุทธ์โทเค็นของ AS - โทเค็นบางอย่างมีอยู่ในตัวเอง (เช่นJSON Web Tokens ) ในขณะที่คนอื่น ๆ อาจคล้ายกับคุกกี้เซสชันในการที่พวกเขาเพียงแค่อ้างอิงข้อมูลด้านเซิร์ฟเวอร์ที่ AS

มีการพูดคุยกันในคณะทำงาน OAuth เกี่ยวกับการสร้างวิธีมาตรฐานสำหรับ RS เพื่อสื่อสารกับการตรวจสอบ AS สำหรับ AT บริษัท ของฉัน (ปิอัตลักษณ์) ได้เกิดขึ้นกับหนึ่งในวิธีการดังกล่าวเพื่อการพาณิชย์ OAuth ของเราเป็น (PingFederate): https://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn1564003025072__section_N10578_N1002A_N10001 ใช้การโต้ตอบที่ใช้ REST สำหรับสิ่งนี้ซึ่งเป็นส่วนเสริมของ OAuth 2.0


Scott T, มีวิธีดูตัวอย่างโค้ดเกี่ยวกับวิธีใช้คุณลักษณะใน Ping Federate หรือไม่
JavaHead

2
@JavaHead มีรายละเอียดเพิ่มเติมเกี่ยวกับโพรโทคอลในเว็บไซต์นักพัฒนาซอฟต์แวร์ของเราที่นี่: developer.pingidentity.com/th/resources/… , PingFederate OAuth Playground จัดส่งเป็นชุดของ JSP ที่สามารถอ้างถึงเป็นซอร์สโค้ดสำหรับการตรวจสอบโทเค็น สามารถดาวน์โหลด (และไลบรารี่และตัวอย่างโอเพนซอร์สอื่น ๆ ได้จากที่นี่: developer.pingidentity.com/en/code.html
Scott T.

สกอตต์ฉันกำลังมองหาตัวอย่างที่แสดงให้เห็นถึงข้อมูลรับรองลูกค้าที่ให้สิทธิ์กับ Rest API ที่ได้รับการป้องกันโดยเซิร์ฟเวอร์ทรัพยากรในท้องถิ่นและ PingFederate เป็นเซิร์ฟเวอร์รับรองความถูกต้อง เซิร์ฟเวอร์ทรัพยากรท้องถิ่นจะเรียกจุดตรวจสอบความถูกต้อง คุณเจออะไรแบบนั้นรึเปล่า?
JavaHead

@JavaHead อีกครั้งนั่นเป็นสิ่งที่คุณควรจะอ้างอิง PingFederate OAuth Playground สำหรับ มันแสดงให้เห็นถึงทั้งลูกค้าประเภทการให้สิทธิ์และการตรวจสอบการเข้าถึงโทเค็นโดยเซิร์ฟเวอร์ทรัพยากร
Scott T.

ในกรณีของโทเค็นการเข้าถึง JWT ฉันคิดว่าโดยทั่วไปคุณจะไม่ต้องการที่จะไปถึงจุดสิ้นสุดการใคร่ครวญ AS สำหรับทุกคำขอที่เข้ามาสู่ RS ในกรณีใดการตรวจสอบ RS ของลายเซ็นโทเค็นและขอบเขตเพียงพอหรือไม่ หรือบางทีอาร์เอสอาจแคชคำตอบวิปัสสนาจาก AS เป็นระยะเวลาหนึ่ง
Gary

119

วิธีของ Google

การตรวจสอบโทเค็นของ Google Oauth2

คำขอ:

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

การตอบสนอง:

{
  "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
} 

วิธีของ Microsoft

Microsoft - Oauth2 ตรวจสอบการอนุญาต

วิธี GitHub

Github - Oauth2 ตรวจสอบการอนุญาต

คำขอ:

GET /applications/:client_id/tokens/:access_token

การตอบสนอง:

{
  "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"
  }
}

ทางอเมซอน

เข้าสู่ระบบด้วย Amazon - คู่มือผู้พัฒนา (ธันวาคม 2015, หน้า 21)

ขอ:

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

คำตอบ:

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 มันไม่ได้อธิบายเลยว่าฝั่งเซิร์ฟเวอร์รับรู้รหัสผู้ใช้ที่ได้รับมอบหมายจากโทเค็นได้อย่างไร
user2284570

22
ฉันไม่เข้าใจคะแนนโหวตทั้งหมด สิ่งนี้ดูเหมือนจะไม่ตอบคำถาม
Duncan Jones

ไม่มีใครทราบว่า Azure Active Directory มีจุดปลายที่คล้ายกันเพื่อตรวจสอบว่าโทเค็นที่ออกให้นั้นถูกต้องหรือไม่
user180940

2
ในคำอื่น ๆ ม้วนของคุณเอง
AndroidDev

51

การปรับปรุงเกี่ยวกับคำตอบของ @Scott ตัน: อินเตอร์เฟซระหว่างทรัพยากรของเซิร์ฟเวอร์และการอนุญาตเซิร์ฟเวอร์สำหรับการตรวจสอบโทเค็นเป็นมาตรฐานใน IETF RFC 7662 ในเดือนตุลาคมปี 2015 ดู: https://tools.ietf.org/html/rfc7662 ตัวอย่างการตรวจสอบความถูกต้องจะมีลักษณะดังนี้:

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

และการตอบสนองตัวอย่าง:

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"
}

แน่นอนว่าการยอมรับโดยผู้ขายและผลิตภัณฑ์จะต้องเกิดขึ้นเมื่อเวลาผ่านไป


หากใช้ OoenId Connect เราไม่ควรใช้วิธีเปิดรหัสโทเค็นเพื่อตรวจสอบการเข้าถึงโทเค็น: openid.net/specs/ …
adnan kamili

1
@Renan: เพื่อให้สอดคล้องกับวิธีการที่มีการร้องขอขอบเขตในคำขอการให้สิทธิ์ซึ่งขึ้นอยู่กับscopeพารามิเตอร์การค้นหาที่มีค่าประกอบด้วยรายการของขอบเขตที่คั่นด้วยช่องว่าง
Hans Z.

4
โปรดอย่าใช้คำว่า "มาตรฐาน" เมื่อสิ่งที่ไม่ได้รับการยอมรับอย่างเป็นทางการจากองค์กรที่กำกับดูแล IETF RFC 7662 ณ เดือนกุมภาพันธ์ 2018 แสดงให้เห็นอย่างชัดเจนว่าเป็น "ข้อเสนอ"
AndroidDev

1
@adnankamili ไม่มีสิ่งเช่น "ข้อเสนอ" เมื่อถึงเวลาที่เอกสารกลายเป็น RFC มันก็เป็น "มาตรฐานที่เสนอ" ซึ่งมีน้ำหนักที่สำคัญอยู่ข้างหลัง OAuth 2.0 นั้นยังคงเป็น "มาตรฐานที่เสนอ" ดังนั้นฉันจึงไม่แน่ใจว่าคุณกำลังพยายามทำอะไร
Pace

15

ข้อมูลจำเพาะ OAuth 2.0 ไม่ได้กำหนดชิ้นส่วนไว้ แต่อาจมีสองตัวเลือก:

  1. เมื่อเซิร์ฟเวอร์ทรัพยากรได้รับโทเค็นใน Authz Header ดังนั้นจะเรียกใช้ validate / introspect API บนเซิร์ฟเวอร์ Authz เพื่อตรวจสอบโทเค็น ที่นี่เซิร์ฟเวอร์ Authz อาจตรวจสอบได้ไม่ว่าจะจากการใช้ DB Store หรือตรวจสอบลายเซ็นและคุณลักษณะบางอย่าง เป็นส่วนหนึ่งของการตอบสนองมันจะถอดรหัสโทเค็นและส่งข้อมูลจริงของโทเค็นพร้อมกับเวลาหมดอายุที่เหลืออยู่

  2. เซิร์ฟเวอร์ Authz สามารถเข้ารหัส / เซ็นโทเค็นโดยใช้คีย์ส่วนตัวจากนั้น publickey / cert สามารถมอบให้กับ Resource Server เมื่อเซิร์ฟเวอร์ทรัพยากรได้รับโทเค็นมันจะถอดรหัส / ตรวจสอบลายเซ็นเพื่อตรวจสอบโทเค็น นำเนื้อหาออกและประมวลผลโทเค็น จากนั้นสามารถให้การเข้าถึงหรือปฏิเสธ


8

ข้อกำหนดของ OAuth v2 บ่งชี้:

แอ็ตทริบิวต์โทเค็นการเข้าถึงและวิธีการที่ใช้ในการเข้าถึงทรัพยากรที่มีการป้องกันนั้นอยู่นอกเหนือขอบเขตของข้อกำหนดนี้และถูกกำหนดโดยข้อกำหนดคุณลักษณะร่วม

เซิร์ฟเวอร์การอนุญาตของฉันมีจุดปลาย webservice (SOAP) ที่อนุญาตให้เซิร์ฟเวอร์ทรัพยากรทราบว่า access_token นั้นถูกต้องหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.