มีข้อมูลมากมายบนเว็บเกี่ยวกับการใช้ JWT ( Json Web Token
) สำหรับการพิสูจน์ตัวตน แต่ผมก็ยังไม่พบว่ามีคำอธิบายที่ชัดเจนของสิ่งที่ไหลควรจะเป็นเมื่อใช้ JWT สัญญาณสำหรับการลงชื่อเข้าใช้ในการแก้ปัญหาเดียวในสภาพแวดล้อมหลายโดเมน
ฉันทำงานให้กับ บริษัท แห่งหนึ่งซึ่งมีไซต์จำนวนมากในโฮสต์ที่แตกต่างกัน ใช้ Let 's example1.comและexample2.com เราจำเป็นต้องมี single sign-on วิธีการแก้ปัญหาซึ่งหมายความว่าถ้าพิสูจน์ผู้ใช้บนexample1.comเราต้องการให้เขายังได้รับการรับรองความถูกต้องในexample2.comโดยอัตโนมัติ
เมื่อใช้ขั้นตอนการเชื่อมต่อ OpenIdฉันเข้าใจว่าผู้ใช้ที่ต้องการตรวจสอบสิทธิ์บนexample1.comจะถูกเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์การตรวจสอบความถูกต้อง (หรือOP
: "OpenId Provider") ผู้ใช้พิสูจน์ตัวตนบนเซิร์ฟเวอร์นั้นซึ่งจะเปลี่ยนเส้นทางเขากลับไปยังไซต์example1.comดั้งเดิมด้วยโทเค็น JWT ที่ลงชื่อ (ฉันเข้าใจว่ามีอีกขั้นตอนหนึ่งที่ส่งคืนโทเค็นระดับกลางที่สามารถแลกเปลี่ยนกับโทเค็น JWT จริงได้ในภายหลัง แต่ฉันไม่คิดว่าสิ่งนี้จำเป็นสำหรับเรา) ...
ตอนนี้ผู้ใช้กลับมาที่example1.comและได้รับการรับรองความถูกต้องแล้ว! เขาสามารถส่งคำขอส่งโทเค็น JWT ในAuthentication
ส่วนหัวและเซิร์ฟเวอร์สามารถตรวจสอบ JWT ที่ลงนามแล้วดังนั้นจึงสามารถระบุผู้ใช้ได้ ดี!
คำถามแรก:
ควรเก็บโทเค็น JWT บนไคลเอนต์อย่างไร นอกจากนี้อีกครั้งข้อมูลจำนวนมากเกี่ยวกับเรื่องนี้และคนที่ดูเหมือนจะยอมรับว่าการใช้เป็นวิธีที่จะไปมากกว่าดีเก่าWeb Storage
cookies
เราต้องการให้ JWT คงอยู่ระหว่างการรีสตาร์ทเบราว์เซอร์ดังนั้นขอใช้Local Storage
ไม่ใช่Session Storage
...
ตอนนี้ผู้ใช้สามารถรีสตาร์ทเบราว์เซอร์ได้และจะยังคงได้รับการรับรองความถูกต้องบนexample1.comตราบใดที่โทเค็น JWT ยังไม่หมดอายุ!
นอกจากนี้หากexample1.comต้องการส่งคำขอ Ajax ไปยังโดเมนอื่นของเราฉันเข้าใจว่าการกำหนดค่าCORSจะอนุญาตให้ทำได้ แต่กรณีการใช้งานหลักของเราไม่ใช่คำขอข้ามโดเมน แต่มีโซลูชันการลงชื่อเพียงครั้งเดียว !
ดังนั้นคำถามหลัก:
ตอนนี้โฟลว์ควรเป็นอย่างไรหากผู้ใช้ไปที่example2.comและเราต้องการให้เขาได้รับการพิสูจน์ตัวตนโดยใช้โทเค็น JWT ที่เขามีอยู่แล้ว Local Storage
ดูเหมือนจะไม่อนุญาตการเข้าถึงข้ามโดเมนดังนั้น ณ จุดนี้เบราว์เซอร์จึงไม่สามารถอ่านโทเค็น JWT เพื่อส่งคำขอไปยังexample2.com ได้ !
ควร:
- ผู้ใช้ถูกเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์การตรวจสอบอีกครั้งหรือไม่? เมื่อผู้ใช้รับรองความถูกต้องสำหรับexample1.comที่ เซิร์ฟเวอร์การตรวจสอบอาจมีการตั้งค่าคุกกี้กับผู้ใช้เพื่อให้การตรวจสอบคำขอใหม่สำหรับexample2.comสามารถใช้คุกกี้ที่จะเห็นว่าผู้ใช้จะได้รับรองความถูกต้องแล้วและทันทีที่เปลี่ยนเส้นทางไปเขากลับไป example2.comด้วยโทเค็น JWT เดียวกันหรือไม่
- หรือเบราว์เซอร์บนexample2.comสามารถเข้าถึงโทเค็น JWT โดยไม่ต้องไปที่เซิร์ฟเวอร์การตรวจสอบอีกครั้งได้หรือไม่? ฉันเห็นว่ามีโซลูชันการจัดเก็บข้ามพื้นที่แต่ใช้กันอย่างแพร่หลายหรือไม่ เป็นโซลูชันที่แนะนำสำหรับสภาพแวดล้อม SSO ข้ามโดเมนหรือไม่
เราไม่ต้องการอะไรที่หรูหราเรายินดีกับโซลูชันที่ใช้เป็นส่วนใหญ่!