รักษาความปลอดภัยทรัพยากร API ของคุณสำหรับการสื่อสารระหว่างเครื่องกับเครื่อง
เรียนรู้วิธีใช้ประโยชน์จาก OAuth 2.0 และ JWT เพื่อรักษาความปลอดภัยทรัพยากร API ของคุณสำหรับการสื่อสารระหว่างเครื่องกับเครื่อง
เรียนรู้วิธีใช้ประโยชน์จาก OAuth 2.0 และ JWT เพื่อรักษาความปลอดภัยทรัพยากร API ของคุณสำหรับการสื่อสารระหว่างเครื่องกับเครื่อง
เมื่อสร้างโปรเจคที่เกี่ยวข้องกับบริการหลายอย่าง ความปลอดภัยของทรัพยากร API จะเป็นความกังวลสำคัญ ในบทความนี้ ฉันจะแสดงวิธีใช้ประโยชน์จาก OAuth 2.0 และ JWT เพื่อรักษาความปลอดภัยการสื่อสารระหว่างบริการ (เครื่องกับเครื่อง) และวิธีใช้การควบคุมการเข้าถึงตามบทบาท (RBAC) ให้เป็นไปตามหลักความสิทธิขั้นต่ำ
เพื่อให้ตามทัน ฉันให้คุณมีสิ่งที่จำเป็นต่อไปนี้:
เพื่อเป็นการสาธิต ลองสมมติว่าเรามีบริการต่อไปนี้:
https://cart.example.com/apihttps://payment.example.com/apiตอนนี้ บริการรถเข็นของเราจำเป็นต้องเรียกบริการชำระเงินเพื่อประมวลผลการชำระเงิน ลำดับขั้นตอนการตรวจสอบสิทธิ์มีดังนี้:
แนวคิดสำคัญบางประการในแผนผังข้างต้น:
ผู้เข้าร่วมแต่ละคนในแผนผังข้างต้นมีบทบาทในลำดับขั้นตอนการตรวจสอบสิทธิ์:
มาทำตามลำดับขั้นตอนการตรวจสอบสิทธิ์ทีละขั้นตอนกันเถอะ
เพื่อดำเนินลำดับขั้นตอนการตรวจสอบสิทธิ์ เราจำเป็นต้องสร้างแอปพลิเคชันระหว่างเครื่องกับเครื่อง (บริการรถเข็น) และทรัพยากร API (บริการชำระเงิน) ใน Logto
ตั้งแต่บริการรถเข็นของเราจำเป็นต้องทราบ API ของบริการชำระเงินเมื่อดำเนินการตรวจสอบสิทธิ์ เราจำเป็นต้องสร้างทรัพยากร API ก่อน ไปที่ Logto Console คลิก API resources ในแถบด้านซ้าย แล้วคลิก Create API resource ในกล่องโต้ตอบที่เปิด เรามีบางบทช่วยสอนเพื่อช่วยคุณเริ่มต้น คุณยังสามารถคลิก Continue without tutorial เพื่อข้ามไป
ใส่ชื่อ API และตัวระบุ เช่น Payment service และ https://payment.example.com/api แล้วคลิก Create API resource
หลังจากสร้างทรัพยากร API แล้ว คุณจะถูกเปลี่ยนเส้นทางไปยังหน้ารายละเอียด เราสามารถปล่อยไว้อย่างนั้นสำหรับตอนนี้
คลิก Applications ในแถบด้านซ้าย แล้วคลิก Create application ในกล่องโต้ตอบที่เปิด ค้นหาการ์ด Machine-to-machine แล้วคลิก Start building
ใส่ชื่อแอปพลิเคชัน เช่น Cart service แล้วคลิก Create application จะมีคำแนะนำแบบโต้ตอบเพื่อช่วยคุณตั้งค่าแอปพลิเคชัน คุณสามารถทำตามคำแนะนำเพื่อเข้าใจการใช้งานพื้นฐาน หรือคลิก Finish and done เพื่อข้ามไป
เนื่องจากแอปพลิเคชันระหว่างเครื่องกับเครื่องถือว่าปลอดภัย (เช่น ถูกนำไปใช้งานในเครือข่ายส่วนตัว) เราสามารถใช้ OAuth 2.0 "client_credentials" grant เพื่อขอโทเค็นการเข้าถึง มันใช้ basic authentication เพื่อยืนยันตัวตนของไคลเอ็นต์:
POSTContent-Type ของคำขอคือ application/x-www-form-urlencodedAuthorization ค่าเป็น Basic <base64(app_id:app_secret)>, ซึ่ง app_id และ app_secret เป็นรหัสแอปและความลับแอปของแอปพลิเคชันระหว่างเครื่องกับเครื่องตามลำดับ คุณสามารถค้นหามันได้ในหน้ารายละเอียดแอปพลิเคชันgrant_type=client_credentials&resource=https://payment.example.com/api
grant_type=client_credentials: ค่าเฉพาะสำหรับ "client_credentials" grantresource=https://payment.example.com/api: ตัวระบุ API ของทรัพยากร API ที่ไคลเอ็น ต้องการเข้าสอดนี่คือตัวอย่างของคำขอโดยใช้ curl:
เนื้อหาตอบกลับที่สำเร็จจะเป็นอย่างนี้:
ตอนนี้เรามีโทเค็นการเข้าถึงและเราสามารถแนบมันไปในส่วนหัว Authorization ของคำขอไปยังทรัพยากร API ได้ ตัวอย่าง หากเราต้องการเรียก API POST /payments ของบริการชำระเงิน เราสามารถส่งคำขอดังนี้:
คุณอาจสังเกตเห็นว่าบริการชำระเงินจำเป็นต้องยืนยัน JWT โดยใช้ชุด JWK และอาจมีแคชชุด JWK ในเครื่องเพื่อหลีกเลี่ยงการเรียกชุด JWK จาก Logto ทุกครั้ง โชคดีที่เนื่องจากความนิยมของ JWT มีหลายไลบรารีที่สามารถช่วยคุณบรรลุเป้าหมายได้ด้วยโค๊ดที่มีไม่กี่บรรทัด
ไลบรารีเหล่านี้มักจะเรียกว่า "jose" (JavaScript Object Signing and Encryption) หรือ "jsonwebtoken" ตัวอย่าง ใน Node.js เราสามารถใช้ jose เพื่อยืนยัน JWT:
ถ้าการตรวจสอบสำเร็จ ตัวแปร payload จะเป็นพย์โหลด JWT ที่ถอดรหัสแล้ว มิฉะนั้นจะมีการโยนข้อผิดพลาด
ตอนนี้เราประสบความสำเร็จในการรักษาความปลอดภัยการสื่อสารระหว่างบริการรถเข็นและบริการชำระเงินแล้ว อย่างไรก็ตาม ขั้นตอนการตรวจสอบสิทธิ์นี้เพียงแต่รับรองว่าไคลเอ็นต์คือบริการรถเข็นจริง แต่ไม่ได้หมายความว่าบริการรถเข็นนั้นมีสิทธิ์ใด ๆ ในการดำเนินการใด ๆ ต่อบริการชำระเงิน
ลองสมมติว่าเราต้องการอนุญาตให้บริการรถเข็นสร้างการชำระเงินได้ แต่ไม่ให้มีการอ่านการชำระเงิน
ใน Logto, "scopes" และ "permissions" นั้นสามารถแทนที่กันได้ ไปที่หน้ารายละเอียดของทรัพยากร API ของบริการชำระเงิน และไปที่แท็บ Permissions ซึ่งควรจะว่างเปล่าตอนนี้ คลิก Create permission, ใส่ read:payment เป็นชื่อสิทธิ์ และใส่ Read payments เป็นคำอธิบายสิทธิ์ จากนั้นคลิก Create permission
ทำซ้ำขั้นตอนข้างต้นเพื่อสร้างสิทธิ์อื่นชื่อ write:payment และคำอธิบาย Create payments
บทบาทคือกลุ่มของสิทธิ์ ใน Logto, แอพระหว่างเครื่องกับเครื่องสามารถถูกกำหนดบทบาทเพื่อให้สิทธิ์ได้ คลิก "Roles" ในแถบด้านซ้าย แล้วคลิก Create role
checkout เป็นชื่อบทบาท และใส่ Checkout service เป็นคำอธิบายบทบาทwrite:payment


นอกจากพารามิเตอร์เนื้อหาของคำขอที่เรากล่าวถึงใน ขอรับโทเค็นการเข้าถึง, เรายังสามารถระบุขอบเขตในเนื้อหาร้องขอได้ด้วย ตัวอย่างเช่น ถ้าต้องการขอสิทธิ์ write:payment, เราสามารถส่งคำขอที่ดังนี้:
เพื่อขอรับขอบเขตหลายขอบเขต, คุณสามารถแยกมันด้วยช่องว่าง ตัวอย่างเช่น scope=write:payment read:payment
หากการกระทำจำเป็นต้องมีสิทธิ์ write:payment ในบริการชำระเงิน, เราสามารถยืนยันขอบเขตโดยการยืนยันว่า scope claim ของพย์โหลด JWT:
หากคุณต้องการป้องกันการเข้าถึงบริการรถเข็น, คุณสามารถใช้ขั้นตอนการตรวจสอบสิทธิ์เดียวกันได้ ครั้งนี้ บริการรถเข็นจะเป็นทรัพยากร API และไคลเอ็นต์จะเป็นบริการอื่นที่ต้องเข้าถึง
ด้วย Logto ทรัพยากร API ของคุณได้รับการปกป้องด้วย OAuth 2.0 และ JWT และคุณสามารถปฏิบัติตามหลักความสิทธิขั้นต่ำโดยการใช้การควบคุมการเข้าถึงตามบทบาท นอกจากนี้ คุณยังสามารถใช้ Logto เพื่อจัดการผู้ใช้และสิทธิ์ของพวกเขา และแม้กระทั่งรวมเข้ากับผู้ให้บริการระบุตัวตนภายนอก