เจตนาของเวลาหมดอายุ ID Token ใน OpenID Connect คืออะไร?


93

ใน OpenID Connect โทเค็นการเข้าถึงมีเวลาหมดอายุ สำหรับโฟลว์รหัสการอนุญาตโดยทั่วไปจะสั้น (เช่น 20 นาที) หลังจากนั้นคุณใช้โทเค็นการรีเฟรชเพื่อขอโทเค็นการเข้าถึงใหม่

ID tokenนอกจากนี้ยังมีเวลาหมดอายุ คำถามของฉันคือเจตนาของสิ่งนี้คืออะไร?

เวลาหมดอายุของโทเค็น ID ใด ๆ น้อยกว่าเวลาหมดอายุของโทเค็นการรีเฟรชจะหมายความว่าในที่สุดคุณจะมีโทเค็น ID ที่หมดอายุ แต่โทเค็นการเข้าถึงที่ถูกต้อง

คุณตั้งใจที่จะ:

  • กำหนดให้โทเค็นรหัสของคุณหมดอายุนานกว่าการหมดอายุโทเค็นการรีเฟรชหรือ
  • ตั้งค่าให้หมดอายุเช่นเดียวกับโทเค็นการเข้าถึงและดำเนินการบางอย่าง (อะไรนะ?) เมื่อหมดอายุหรือ
  • เพียงแค่ใช้โทเค็น ID ในไคลเอนต์ของคุณในใบเสร็จรับเงินจากนั้นละเว้นเวลาหมดอายุหลังจากนั้น?

ข้อกำหนดOpenID Connectบอกว่าเมื่อตรวจสอบความถูกต้องของโทเค็น ID

"The current time MUST be before the time represented by the exp Claim."

ซึ่ง (อาจ) รองรับตัวเลือกที่สามด้านบน


แก้ไข

เนื่องจาก OpenID Connect สร้างบน OAuth2 คำตอบสำหรับคำถามเสริมด้านล่างสามารถพบได้ในข้อกำหนด OAuth2ซึ่งกล่าวว่า

expires_in
     RECOMMENDED.  The lifetime in seconds of the access token.

คำถามที่เกี่ยวข้องคือเมื่อคุณแลกเปลี่ยนรหัสการอนุญาตสำหรับโทเค็นข้อกำหนดเดียวกันระบุว่าคุณอาจได้รับคำตอบเช่น:

{
 "access_token": "SlAV32hkKG",
 "token_type": "Bearer",
 "refresh_token": "8xLOxBtZp8",
 "expires_in": 3600,
 "id_token": "eyJhbG[...]"
}

แต่ "expires_in" เกี่ยวข้องกับอะไรในกรณีนี้ โทเค็นการเข้าถึงโทเค็นการรีเฟรชหรือโทเค็น ID?

(สำหรับข้อมูลIdentityServer3ตั้งค่านี้เป็นเวลาหมดอายุโทเค็นการเข้าถึง)

คำตอบ:


91

ฉันกำลังตอบคำถามของตัวเองเนื่องจากพบว่าสมมติฐานบางอย่างที่อยู่เบื้องหลังคำถามของฉันผิดดังนั้นจึงง่ายต่อการชี้แจงที่นี่แทนที่จะเขียนคำถามซ้ำ

โทเค็น ID มีไว้เพื่อพิสูจน์ให้ลูกค้าทราบว่าผู้ใช้ได้พิสูจน์ตัวตนแล้วและผลที่ตามมาคือใคร

เมื่อลูกค้าได้รับโทเค็น ID โดยทั่วไปจะทำบางอย่างเช่นแปลงเป็น ClaimsIdentity และคงอยู่เช่นการใช้คุกกี้

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

สมมติฐานที่ผิดของฉันเมื่อถามคำถามคือควรใช้โทเค็น ID และโทเค็นการเข้าถึงร่วมกันดังนั้นทั้งคู่จึงจำเป็นต้องมีวันหมดอายุที่ถูกต้อง สิ่งนี้ผิดจากหลายสาเหตุ:

  • ID โทเค็นใช้สำหรับการพิสูจน์ตัวตนกับลูกค้าเท่านั้น (ตามที่อธิบายไว้ข้างต้น)
  • โทเค็นการเข้าถึงไม่มีส่วนเกี่ยวข้องกับไคลเอนต์ มีไว้สำหรับการเข้าถึงทรัพยากรและลูกค้าจะจัดการเฉพาะในกรณีที่จำเป็นต้องเรียกทรัพยากร
  • สิ่งที่ต้องการแบบสแตนด์อโลน MVC หรือ WebForms แอพลิเคชันเพียงต้องการโทเค็นรหัส หากไม่ได้เรียกใช้ทรัพยากรภายนอกจะไม่มีสิ่งใดให้สิทธิ์เข้าถึงดังนั้นจึงไม่มีโทเค็นการเข้าถึง

3
คุณมีข้อมูลอ้างอิงสำหรับสิ่งนี้หรือไม่? Eugenio อ้างว่าคุณสามารถรีเฟรชโทเค็น id ในคำตอบของเขาได้ นี่คือเรื่องจริง?
AndyD

6
คุณไม่สามารถรีเฟรชโทเค็น ID ได้ในแง่ของการขยายเวลาหมดอายุ (เช่นเดียวกับการรีเฟรชโทเค็นการเข้าถึงโดยใช้โทเค็นการเข้าถึงแบบออฟไลน์) แต่ถ้าคุณมีเซสชันการพิสูจน์ตัวตนที่ยังไม่หมดอายุกับ OpenID Connect Provider (เช่นคุกกี้หลังจากล็อกอินเข้าสู่ IdentityServer3) เมื่อคุณร้องขอการเข้าสู่ระบบซ้ำผู้ให้บริการสามารถข้ามการพิสูจน์ตัวตนได้ (เนื่องจากคุกกี้บอกว่าคุณได้ทำไปแล้ว) และส่งคืน ID Token ใหม่ (& access-token หากมีการร้องขอ) จะใช้ได้เฉพาะในกรณีที่คุกกี้มีอายุการใช้งานนานกว่า ID Token แน่นอน
Appetere

1
แม้ว่าคุณจะทำได้ แต่ฉันไม่แน่ใจว่าจะทำถูกต้องหรือไม่ นอกจากนี้ยังจะไม่ราบรื่นสำหรับผู้ใช้ปลายทางเนื่องจากจะต้องใช้การเปลี่ยนเส้นทางเบราว์เซอร์เพียงไม่กี่ครั้ง
Kir

@Kir หากคุณใช้แอป Javascript หน้าเดียว (SPA) ความพยายามครั้งแรกในการต่ออายุโทเค็น acces-token มักจะเป็นกระบวนการเบื้องหลังดังนั้นผู้ใช้ปลายทางจะไม่ถูกขัดจังหวะ เช่นหาก API ของทรัพยากรของคุณตอบสนองว่าโทเค็นการเข้าถึงหมดอายุ SPA จะส่งคำขอพื้นหลังไปยังเซิร์ฟเวอร์ข้อมูลประจำตัวสำหรับโทเค็นการเข้าถึงใหม่ เฉพาะในกรณีที่ล้มเหลว (เนื่องจากโทเค็น ID หมดอายุ) คุณต้องขอให้ผู้ใช้เข้าสู่ระบบอีกครั้ง ดูตัวอย่าง JavascriptImplicitClient ที่github.com/IdentityServer/IdentityServer3.Samples/tree/master/…สำหรับโค้ดตัวอย่าง
Appetere

คุณสามารถรีเฟรช Id_token ได้หากผู้ให้บริการ OIdC สนับสนุนส่งคืนจากคำขอ Refresh_token ดูstackoverflow.com/questions/41168304/…และstackoverflow.com/questions/41741982/…
Michael Freidgeim

37

ฉันต้องเจาะลึกเรื่องนี้ด้วยเหตุผลของตัวเองและเขียนมันขึ้นมาดังนั้นฉันจะโพสต์สิ่งที่ได้เรียนรู้ที่นี่ ...

ก่อนอื่นฉันจะตอบคำถามที่เสี่ยงต่อการระบุสิ่งที่ชัดเจน: โทเค็น ID ไม่สามารถเชื่อถือได้และเนื้อหาจะต้องถูกละเว้นหากเวลาปัจจุบันมากกว่าเวลาที่หมดอายุ คำตอบของผู้ถามระบุว่าหลังจากการพิสูจน์ตัวตนครั้งแรกของผู้ใช้ ID Token จะไม่ถูกใช้อีก อย่างไรก็ตามเนื่องจาก ID Token ได้รับการลงนามโดยผู้ให้บริการข้อมูลประจำตัวจึงมีประโยชน์อย่างแน่นอนในการระบุวิธีที่เชื่อถือได้ว่าผู้ใช้คือใครกับบริการอื่น ๆ ที่แอปอาจใช้อยู่ การใช้ ID ผู้ใช้หรือที่อยู่อีเมลแบบธรรมดานั้นไม่น่าเชื่อถือ เนื่องจากสามารถปลอมแปลงได้ง่าย (ทุกคนสามารถส่งที่อยู่อีเมลหรือรหัสผู้ใช้) แต่เนื่องจาก OIDC ID Token ได้รับการลงนามโดยเซิร์ฟเวอร์ Authorization (ซึ่งโดยปกติจะมีประโยชน์ในการเป็นบุคคลที่สาม) จึงไม่สามารถปลอมแปลงได้และเป็น กลไกการตรวจสอบที่เชื่อถือได้มากขึ้น

ตัวอย่างเช่นแอปบนอุปกรณ์เคลื่อนที่อาจต้องการบอกบริการแบ็กเอนด์ได้ว่าใครคือผู้ใช้ที่ใช้แอปและอาจจำเป็นต้องดำเนินการดังกล่าวหลังจากช่วงเวลาสั้น ๆ หลังจากการตรวจสอบสิทธิ์ครั้งแรกซึ่งเมื่อ ID Token หมดอายุแล้ว ดังนั้นจึงไม่สามารถใช้เพื่อพิสูจน์ตัวตนผู้ใช้ได้อย่างน่าเชื่อถือ

ดังนั้นเช่นเดียวกับโทเค็นการเข้าถึง (ใช้สำหรับการอนุมัติ - การระบุสิทธิ์ของผู้ใช้มี) สามารถฟื้นฟู, คุณสามารถรีเฟรชรหัส Token (ใช้สำหรับการรับรองความถูกต้อง - การระบุที่ผู้ใช้อยู่)? ตามข้อกำหนด OIDC คำตอบไม่ชัดเจน ใน OIDC / OAuth มี "โฟลว์" สามรายการสำหรับการรับโทเค็นโฟลว์รหัสการอนุญาตโฟลว์โดยนัยและโฟลว์ไฮบริด (ซึ่งฉันจะข้ามไปด้านล่างเพราะเป็นตัวแปรของอีกสองรายการ)

สำหรับโฟลว์โดยนัยใน OIDC / OAuthคุณขอ ID Token ที่จุดสิ้นสุดการอนุญาตโดยเปลี่ยนเส้นทางผู้ใช้ในเบราว์เซอร์ไปยังจุดสิ้นสุดการอนุญาตและรวมid_tokenเป็นค่าของresponse_typeพารามิเตอร์คำขอ การตอบสนองการพิสูจน์ตัวตนที่ประสบความสำเร็จของโฟลวโดยนัยจำเป็นต้องรวมไฟล์id_token.

สำหรับโฟลว์ Authentication Codeไคลเอ็นต์ระบุcodeเป็นค่าของresponse_typeพารามิเตอร์คำร้องขอเมื่อเปลี่ยนทิศทางผู้ใช้ไปยังจุดสิ้นสุดการอนุญาต การตอบสนองที่ประสบความสำเร็จประกอบด้วยรหัสการอนุญาต ลูกค้าลูกค้าที่ทำให้การร้องขอไปยังปลายทางโทเค็นกับรหัสอนุมัติและตามOIDC หลักมาตรา 3.1.3.3 ที่ประสบความสำเร็จ Token ตอบสนอง การตอบสนองจะต้องมีรหัส Token

ดังนั้นสำหรับทั้งสองขั้นตอนนั่นเป็นวิธีที่คุณได้รับ ID Token ในตอนแรก แต่คุณจะรีเฟรชได้อย่างไร? OIDC ส่วนที่ 12: การใช้โทเค็นการรีเฟรชมีคำสั่งต่อไปนี้เกี่ยวกับการตอบสนองการรีเฟรชโทเค็น:

เมื่อตรวจสอบความสำเร็จในการรีเฟรช Token ร่างกายตอบสนองเป็น Token ตอบสนองของมาตรา 3.1.3.3 ยกเว้นว่ามันอาจจะไม่ประกอบด้วย id_token

มันอาจจะไม่มีรหัส Token และตั้งแต่มีวิธีใดที่ระบุบังคับให้รวมถึงโทเค็น ID คุณต้องคิดว่าการตอบสนองจะไม่ประกอบด้วยรหัส Token ดังนั้นในทางเทคนิคจึงไม่มีวิธีที่ระบุในการ "รีเฟรช" ID Token โดยใช้โทเค็นการรีเฟรช ดังนั้นวิธีเดียวที่จะได้รับ ID Token ใหม่คือการให้สิทธิ์ / พิสูจน์ตัวตนผู้ใช้อีกครั้งโดยเปลี่ยนเส้นทางผู้ใช้ไปยังจุดสิ้นสุดการให้สิทธิ์และเริ่มขั้นตอนโดยนัยหรือโฟลว์รหัสการพิสูจน์ตัวตนตามที่อธิบายไว้ข้างต้น ข้อกำหนด OIDC จะเพิ่มpromptพารามิเตอร์การร้องขอไปยังคำขอการอนุญาตเพื่อให้ไคลเอ็นต์สามารถร้องขอให้เซิร์ฟเวอร์การอนุญาตไม่พร้อมท์ผู้ใช้ด้วย UI ใด ๆ แต่การเปลี่ยนเส้นทางยังคงต้องเกิดขึ้น


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

แล้ว id_token จะรีเฟรชได้อย่างไร?
jwilleke

@jwilleke AFAIK ตามที่กล่าวไว้ข้างต้น "วิธีเดียวที่จะได้รับ ID Token ใหม่คือการให้สิทธิ์ / รับรองความถูกต้องของผู้ใช้อีกครั้งโดยเปลี่ยนเส้นทางผู้ใช้ไปยังจุดสิ้นสุดการให้สิทธิ์"
Scott Willeke

@MichaelFreidgeim น่าสนใจคุณหมายถึงผ่านกลไก Open ID Connect Discoveryหรือไม่? เราทำอย่างนั้นได้อย่างไร?
Scott Willeke

1
คำตอบที่ดีเกี่ยวกับ "ส่วนตอบสนองของการรีเฟรชอาจไม่มี id_token" โหวตแล้ว อย่างไรก็ตามความเข้าใจของฉันคือข้อกำหนด OIDC ทำให้มีช่องว่างในการใช้ Refresh Token เพื่อรับโทเค็น ID ใหม่: ไคลเอนต์สามารถทำได้โดยระบุ "id_token" เป็นหนึ่งในขอบเขต แต่ข้อควรระวังทั่วไปยังคงใช้ที่นี่เนื่องจากเป็นเซิร์ฟเวอร์การตรวจสอบความถูกต้องในการตัดสินใจขั้นสุดท้ายว่าจะปฏิบัติตามขอบเขตที่คุณร้องขอหรือไม่
RayLuo

7

หากฉันเข้าใจถูกต้องตามนี้และข้อมูลจำเพาะ OpenID Connect Core 1.0โทเค็น ID เองสามารถถูกเก็บไว้ในคุกกี้เพื่อเป็นกลไกในการคงอยู่ของเซสชันและส่งไปพร้อมกับคำขอที่ต้องมีการตรวจสอบความถูกต้องทั้งหมดไปยังไคลเอนต์ จากนั้นลูกค้าสามารถยืนยันโทเค็น ID ได้ทั้งภายในเครื่องหรือผ่านจุดสิ้นสุดของผู้ยืนยันของผู้ให้บริการ (หากมีให้เช่นเดียวกับ Google ) หากโทเค็นหมดอายุควรทำการร้องขอการตรวจสอบสิทธิ์อีกครั้งยกเว้นในครั้งนี้ด้วยprompt=noneในพารามิเตอร์ URL และอย่าลืมส่งโทเค็น ID ที่หมดอายุในid_token_hintพารามิเตอร์มิฉะนั้นผู้ให้บริการอาจส่งคืนข้อผิดพลาด

ดังนั้นจึงดูเหมือนเป็นเรื่องปกติที่ ID Token จะหมดอายุ แต่prompt=noneมั่นใจได้ว่าจะได้รับโทเค็น ID ใหม่อย่างราบรื่นโดยไม่มีการแทรกแซงของผู้ใช้ (เว้นแต่ผู้ใช้จะออกจากระบบ OpenID นั้น)


6

เป็นเจตนาเดียวกันคุณไม่สามารถใช้id_tokenหลังจากหมดอายุได้ ความแตกต่างที่สำคัญคือ an id_tokenเป็นโครงสร้างข้อมูลและคุณไม่จำเป็นต้องเรียกใช้เซิร์ฟเวอร์หรือปลายทางใด ๆ เนื่องจากข้อมูลจะถูกเข้ารหัสในโทเค็นเอง ปกติaccess_tokenมักเป็นสิ่งประดิษฐ์ทึบแสง (เช่น GUID)

ผู้บริโภคid_tokenจะต้องตรวจสอบความถูกต้อง (เวลา) ของมันเสมอ

ฉันไม่คุ้นเคยกับ IS 100% แต่ฉันเดาว่ามันเป็นช่องอำนวยความสะดวก คุณควรตรวจสอบการexpอ้างสิทธิ์อยู่เสมอ

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


ขอบคุณ Eugenio คำถามหลักที่ฉันมีคือคุณควรทำอย่างไรเมื่อโทเค็น ID หมดอายุ? ฉันคิด (อาจจะผิด) ที่จะต่ออายุโทเค็นการเข้าถึงอายุสั้นคุณ HAD เพื่อใช้โทเค็นการรีเฟรช แต่ถ้า ID-token หมดอายุเหมือนกับ access-token คุณจะมี ID-token ที่หมดอายุทันทีดังนั้นการรีเฟรชโทเค็นการเข้าถึงจะไม่มีจุดหมาย คิดว่าฉันอาจจะพลาดอะไรบางอย่างที่นี่!
Appetere

1
คุณจะใช้ refresh_token (ไม่เพิกถอน) เพื่อรับ access_token หรือ id_token ใหม่ หรือเพียงแค่เป็นผู้ใช้เข้าสู่ระบบอีกครั้ง id_tokens มีเหตุผลเทียบเท่ากับ access_tokens เพียงแค่รูปแบบที่แตกต่างกัน
Eugenio Pace

2
ความเข้าใจล่าสุดของฉันคือเมื่อผู้ใช้มีเซสชันการพิสูจน์ตัวตนกับเซิร์ฟเวอร์การอนุญาตเมื่อโทเค็นการเข้าถึงหมดอายุการเปลี่ยนเส้นทาง 401 => 302 ไปยังเซิร์ฟเวอร์การอนุญาตจะได้รับโทเค็นการเข้าถึงและ ID ใหม่โดยไม่มีการแทรกแซงของผู้ใช้ แต่ในโหมดออฟไลน์ refresh_token จะส่งคืนเฉพาะ access_token ใหม่ซึ่งระบุว่าผู้ใช้บางรายได้รับอนุญาตให้เข้าถึงทรัพยากรบางอย่าง ไม่สามารถส่งคืน id_token ได้เนื่องจากจะบอกว่าผู้ใช้รายนั้นได้รับการพิสูจน์ตัวตนและอยู่ในโหมดออฟไลน์ซึ่งไม่เป็นเช่นนั้น
Appetere

นี่จะเป็นคำตอบที่ดีสำหรับคำถามเกี่ยวกับความแตกต่างระหว่าง id_token และ access_token (โดยเฉพาะเมื่อใช้โทเค็นทึบ / อ้างอิง) เน้นที่การตอบคำถามก่อนแล้วจึงชี้แจงว่าโทเค็นการเข้าถึงและ id โทเค็นใช้อย่างไร?
เทรน

5

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

ในขั้นตอนโดยนัย OIDC คุณเรียกจุดสิ้นสุดการให้สิทธิ์
และรับโทเค็น ID ในการตอบกลับพร้อมกับขอบเขตทั้งหมดและข้อมูลการอ้างสิทธิ์ทั้งหมดในนั้น
ต่อมาเรียก API ที่มีเจตนาที่จะทำกับการไหลของรหัส
ขั้นตอนโดยนัยมีไว้เพื่อเปิดใช้งานจาวาสคริปต์เท่านั้นหรือแอปเบราว์เซอร์เท่านั้น ไม่ใช่แอปที่โต้ตอบกับเซิร์ฟเวอร์
ดังนั้นแม้ว่าจะมีวิธี "รีเฟรช" โทเค็นนี้ แต่คุณก็ไม่ควร - ฉลาดในการรักษาความปลอดภัย - ปล่อยให้โทเค็นมีชีวิตอยู่นานเกินไป มันจะถูกขโมยและนำกลับมาใช้ใหม่โดยผู้ใช้ที่ไม่ได้รับอนุญาตซึ่งแอบอ้างเป็น ID คุณควรบังคับให้เข้าสู่ระบบใหม่สำหรับสิ่งนั้น

ในโฟลว์โค้ดคุณเรียกใช้ปลายทางการอนุญาตของ OP และรับรหัสการอนุญาต (เรียกอีกอย่างว่าโทเค็นการอนุญาตหรือรหัสรับรองความถูกต้องสั้น ๆ ) สิ่งนี้ควรหมดอายุคล้ายกับ id_token ที่คุณได้รับในขั้นตอนโดยนัยด้วยเหตุผลเดียวกันและไม่สามารถและไม่ควรต่ออายุ

จากนั้น UI หรือแอปของคุณจะเรียกใช้ปลายทาง Token ของ OP และได้รับ (บางครั้งหลังจากได้รับความยินยอมเพิ่มเติมจากผู้ใช้ผ่าน UI เพื่ออนุญาตให้ใช้ทรัพยากรที่เป็นของตนบนเซิร์ฟเวอร์ของ OP) ทั้งสอง:

  • id_token สำหรับการตรวจสอบสิทธิ์ - ซึ่งไม่ควรใช้อีกในการเรียกเซิร์ฟเวอร์ยกเว้นเป็นคำใบ้ในระหว่างการออกจากระบบเมื่อการหมดอายุไม่สำคัญอีกต่อไปดังนั้นด้วยเหตุผลข้างต้นควรปล่อยให้หมดอายุและห้ามรีเฟรช
  • access_token ซึ่งในภายหลังเมื่อเรียก API สามารถกำหนดให้กับปลายทาง UserInfo ของ OP ได้ ซึ่งจะส่งคืนการอ้างสิทธิ์และ API สามารถให้สิทธิ์ตามนั้น

คุณสามารถรีเฟรช access_token นี้ได้เนื่องจากจะบอกเฉพาะ API ที่อ้างสิทธิ์ผู้ใช้และทรัพยากรใด (ตามขอบเขตและการอ้างสิทธิ์ของแต่ละขอบเขต) ที่ผู้ใช้ตกลงที่จะมอบให้คุณ ตามที่อธิบายไว้ข้างต้นนี่คือการอนุญาตให้เข้าถึงแม้ว่าผู้ใช้จะไม่ได้เข้าสู่ระบบอีกต่อไป แน่นอนว่าคุณไม่ต้องการอนุญาตให้มีการรีเฟรช id_token เนื่องจากคุณไม่ต้องการอนุญาตให้มีการแอบอ้างบุคคลอื่นโดยไม่ต้องเข้าสู่ระบบ


2
สิ่งที่คุณพูดเกี่ยวกับโฟลว์โดยนัยนั้นไม่ถูกต้องบางส่วน ไคลเอนต์ที่ใช้โฟลว์โดยนัยสามารถรับโทเค็นการเข้าถึงนอกเหนือจากโทเค็น ID และสามารถใช้โทเค็นการเข้าถึงนั้นเพื่อโต้ตอบกับเซิร์ฟเวอร์
Shaun Luttin

มีแนวทางปฏิบัติทั่วไปคือเมื่อ id_token หมดอายุไคลเอ็นต์จะร้องขอโทเค็นใหม่จากเซิร์ฟเวอร์เพื่อให้ผู้ใช้ไม่จำเป็นต้องให้สิทธิ์อีกครั้ง เช่นดูdamienbod.com/2017/06/02/…
Michael Freidgeim

4

ฉันต้องการโพสต์คำตอบนี้เป็นความคิดเห็น แต่เนื่องจากฉันไม่ได้ใช้งาน StackOverflow มากนักฉันเดาว่าฉันกำลังโพสต์เป็นคำตอบอื่น

นอกจากนี้คุณยังใช้id_tokenเป็นid_token_hintเมื่อพยายามที่จะเข้าสู่ระบบของผู้ใช้ออกจากเซสชั่นhttp://openid.net/specs/openid-connect-session-1_0.html ฉันไม่คิดว่ามันสำคัญจริงๆหากid_tokenหมดอายุในตอนนี้เนื่องจากคุณกังวลเกี่ยวกับการออกจากระบบผู้ใช้บางรายเท่านั้น


4

TLDR;

ตรวจสอบความถูกต้องของโทเค็น ID ก่อนที่จะเชื่อถือสิ่งที่ระบุ

รายละเอียดเพิ่มเติม

เจตนาของเวลาหมดอายุของโทเค็น ID ใน OpenID Connect คืออะไร

เจตนาคือการช่วยให้ลูกค้าในการตรวจสอบโทเค็น ID และลูกค้าจะต้องตรวจสอบหมายเลขโทเค็นก่อนที่จะดำเนินการที่ใช้ข้อมูลโทเค็นรหัสของ

จากข้อกำหนด OpenID Implicit Flow :

หากขั้นตอนการตรวจสอบความถูกต้องที่กำหนดไว้ในเอกสารนี้ล้มเหลวการดำเนินการใด ๆ ที่ต้องใช้ข้อมูลที่ไม่สามารถตรวจสอบความถูกต้องได้อย่างถูกต้องจะต้องถูกยกเลิกและข้อมูลที่ไม่สามารถตรวจสอบความถูกต้องจะต้องไม่ถูกนำมาใช้

เพื่อยืนยันสิ่งนั้นเอกสาร OpenID Connect ของ Googleกล่าวเกี่ยวกับการตรวจสอบ ID โทเค็น:

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

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

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