การตั้งค่า Redirect URL
เหมาะสำหรับนักพัฒนาที่ลงทะเบียนแอปในพอร์ทัลนักพัฒนาของ ReceiptRoller บทความนี้อธิบายวิธีตั้งค่า redirect URI (callback URL) ที่ใช้ในโฟลว์ OAuth 2.0 authorization code พร้อมข้อควรระวัง
redirect URI คือ URL สำหรับรับ authorization code หลังจากที่ผู้ใช้กด「อนุญาต」ในหน้าอนุญาตของโฟลว์ OAuth โดย URI ที่ลงทะเบียนตอนลงทะเบียนแอป กับ redirect_uri ที่ระบุตอนส่งคำขอไปยัง /oauth/authorize จริง ต้องตรงกันทั้งหมด (exact match)
บทบาทของ redirect URI
ในโฟลว์ OAuth authorization code ค่าจะถูกส่งต่อตามลำดับต่อไปนี้
- แอปพาผู้ใช้ไปยังหน้าอนุญาตของ ReceiptRoller (พร้อมแนบ
redirect_uri) - ผู้ใช้กด「อนุญาต」
- ReceiptRoller redirect ไปยัง redirect URI ที่ลงทะเบียนไว้ พร้อมพารามิเตอร์
code - แอปใช้
codeเพื่อขอ access token
หากระบุ URI ที่ไม่ได้ลงทะเบียน หรือ URI ที่ต่างจากค่าที่ลงทะเบียนแม้เพียงตัวอักษรเดียวใน redirect_uri ReceiptRoller จะไม่คืน authorization code และจะเกิดข้อผิดพลาด invalid_redirect_uri นี่คือกลไกที่ป้องกันผู้โจมตีขโมย code
กฎการลงทะเบียน
| รายการ | กฎ |
|---|---|
| scheme | https:// จำเป็น (production)http://localhost และ http://127.0.0.1 อนุญาตเฉพาะตอนพัฒนา |
| host | ชื่อโดเมนแบบเต็ม (FQDN) ไม่อนุญาต wildcard (*.example.com) |
| path | กำหนดได้อิสระ แนะนำ path ตามธรรมเนียม เช่น /oauth/callback หรือ /auth/rr/callback |
| query・fragment | ห้ามใส่ใน URI ที่ลงทะเบียน พารามิเตอร์แบบไดนามิกให้ส่งผ่าน state |
| จำนวนที่ลงทะเบียนได้ | สูงสุด 10 รายการต่อแอป |
| ตัวพิมพ์ใหญ่・ตัวพิมพ์เล็ก | แยกความแตกต่าง /Callback และ /callback ถือเป็นคนละอัน |
| slash ท้าย | แยกความแตกต่าง /callback และ /callback/ ถือเป็นคนละอัน |
การแยกใช้สภาพแวดล้อม development และ production
แอปส่วนใหญ่มีหลายสภาพแวดล้อม เช่น「development」「staging」「production」ใน ReceiptRoller คุณสามารถลงทะเบียน redirect URI หลายรายการให้กับแอปเดียวได้ จึงควรเพิ่ม URI ตามแต่ละสภาพแวดล้อมเป็นพื้นฐาน
รูปแบบที่แนะนำ
https://app.example.com/oauth/callback ← production https://staging.example.com/oauth/callback ← staging http://localhost:3000/oauth/callback ← development (เครื่องตัวเอง)
คุณสามารถแยกแอปตามสภาพแวดล้อมได้เช่นกัน แต่เราแนะนำอย่างยิ่งให้แยกแอป production กับแอป development ออกจากกันเสมอ ด้วยเหตุผลดังนี้
- ไม่ต้องแจกจ่าย client secret ของ production ให้นักพัฒนาทุกคน
- ป้องกันอุบัติเหตุที่ความผิดพลาดระหว่างพัฒนาไปทำให้ token ของผู้ใช้ production ใช้ไม่ได้โดยไม่ตั้งใจ
- การตรวจสอบ scope กลุ่ม User เสร็จสิ้นได้ที่แอป production เท่านั้น
http://localhost ในแอป production เมื่อ secret รั่วไหล ผู้โจมตีอาจล่อ authorization code ไปยังเว็บไซต์ปลอมบนเครื่องตัวเองได้
ขั้นตอนการลงทะเบียน
- พอร์ทัลนักพัฒนา → รายการแอป → เปิดแอปเป้าหมาย
- คลิกปุ่ม「+ เพิ่ม」ในส่วน「redirect URI」
- กรอก URI แล้ว「บันทึก」
- ทำซ้ำตามจำนวนสภาพแวดล้อมที่ต้องการ
URI ที่ลงทะเบียนจะมีผลทันที ไม่ต้อง build หรือ deploy แอปใหม่
การใช้พารามิเตอร์ state
ข้อมูลแบบไดนามิก (URL ของหน้าต้นทาง, user ID, token ป้องกัน CSRF เป็นต้น) ไม่ควรฝังลงใน redirect URI โดยตรง แต่ให้ส่งผ่านพารามิเตอร์ state เนื่องจาก ReceiptRoller จะคืน state กลับมาเหมือนเดิมหลังการอนุญาต ฝั่ง callback จึงกู้คืนได้
// คำขออนุญาต https://receiptroller.io/oauth/authorize ?client_id=xxx &redirect_uri=https://app.example.com/oauth/callback &state=eyJjc3JmIjoiYWJjMTIzIiwicmV0dXJuIjoiL2Rhc2hib2FyZCJ9 &scope=store.read &response_type=code // callback https://app.example.com/oauth/callback ?code=... &state=eyJjc3JmIjoiYWJjMTIzIiwicmV0dXJuIjoiL2Rhc2hib2FyZCJ9
state ยังจำเป็นในฐานะมาตรการป้องกัน CSRF ด้วย ให้สร้างค่าสุ่มตอนส่งคำขอ เก็บไว้ใน session และตรวจสอบว่าตรงกันตอน callback
ข้อผิดพลาดที่พบบ่อย
| ข้อผิดพลาด | สาเหตุ | การแก้ไข |
|---|---|---|
invalid_redirect_uri |
ไม่ตรงกับ URI ที่ลงทะเบียนไว้ | ตรวจสอบว่าตรงกันทั้งหมดรวมถึงตัวพิมพ์ใหญ่เล็ก・slash ท้าย・หมายเลขพอร์ต |
redirect_uri_required |
คำขออนุญาตไม่มี redirect_uri |
ต้องใส่ในพารามิเตอร์ query เสมอ |
insecure_redirect_uri |
พยายามลงทะเบียน http:// (นอกจาก localhost) ในแอป production |
เปลี่ยนเป็น https:// |
| ไม่ callback หลังการอนุญาต | host ของ URI ที่ลงทะเบียนมีข้อผิดพลาด DNS/ใบรับรอง | เปิด URI นั้นโดยตรงในเบราว์เซอร์เพื่อยืนยันว่าเข้าถึงได้ |
ข้อควรระวังเมื่อเปลี่ยนแปลง
เมื่อต้องการเปลี่ยน redirect URI ของแอปที่กำลังทำงานอยู่ ให้ทำตามลำดับต่อไปนี้
- เพิ่ม URI ใหม่ (คง URI เดิมไว้)
- เปลี่ยนโค้ด/ตัวแปรสภาพแวดล้อมของแอปให้เป็น URI ใหม่แล้ว deploy
- ยืนยันการทำงานด้วย URI ใหม่
- ลบ URI เดิม
หากลบ URI เดิมทันที คำขออนุญาตที่เกิดขึ้นระหว่างช่วงที่ deploy ยังไม่เสร็จจะล้มเหลวทั้งหมด
คู่มือที่เกี่ยวข้อง
-
วิธีใช้ Reservations APIคู่มือ Reservations API ของ ReceiptRoller (/api/v1/reservations) อธิบายการทำ CRUD และอัปเดตสถานะการจอง การดึง・สร้าง・สร้างชุดของช่องจอง (สล็อต) การดึงข้อมูลโต๊ะ (โต๊ะ・ห้องส่วนตัว・เคาน์เตอร์) ที่ลงทะเบียนไว้ในเลย์เอาต์ร้าน และสถิติการจอง
-
ขอโทเคนไม่ได้ (ข้อผิดพลาดการยืนยันตัวตน)การแยกแยะสาเหตุเมื่อขอ access token ไม่ได้ อธิบายข้อผิดพลาดทั่วไป เช่น invalid_client, invalid_grant, redirect_uri_mismatch และวิธีรับมือ
-
สารบัญความช่วยเหลือสำหรับนักพัฒนาสารบัญความช่วยเหลือสำหรับนักพัฒนา ReceiptRoller รวบรวมตั้งแต่การสมัครเป็นนักพัฒนา การลงทะเบียนแอปพลิเคชัน การยืนยันตัวตน OAuth และสโคป คู่มือการพัฒนา (แอปวอลเล็ต, Webhook สำหรับร้านค้า, Survey API) คู่มือแยกตามโดเมนข้อมูล การใช้งานและความปลอดภัย คอมมูนิตี ไปจนถึงการแก้ปัญหา
-
ดึงรายการบัญชีธุรกิจ・ร้านค้า・เครื่อง POSคู่มือสรุปขั้นตอนการดึงรายการบัญชีธุรกิจที่ผู้ใช้สังกัด ร้านค้าภายใต้บัญชีนั้น และเครื่อง POS ของแต่ละร้านผ่าน REST API จากแอปมือถือ/แอปเซิร์ฟเวอร์ของ ReceiptRoller
-
การขอและการอัปเดตแอ็กเซสโทเคนอธิบายวิธีขอแอ็กเซสโทเคนและรีเฟรชโทเคนที่ใช้กับ ReceiptRoller API, อายุการใช้งาน, ขั้นตอนการอัปเดต และการจัดการเมื่อเกิดเออเรอร์