การตั้งค่า Redirect URL

OAuth redirect URI การลงทะเบียนแอป ความปลอดภัย
บทความนี้เหมาะสำหรับใคร
เหมาะสำหรับนักพัฒนาที่ลงทะเบียนแอปในพอร์ทัลนักพัฒนาของ 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 ค่าจะถูกส่งต่อตามลำดับต่อไปนี้

  1. แอปพาผู้ใช้ไปยังหน้าอนุญาตของ ReceiptRoller (พร้อมแนบ redirect_uri)
  2. ผู้ใช้กด「อนุญาต」
  3. ReceiptRoller redirect ไปยัง redirect URI ที่ลงทะเบียนไว้ พร้อมพารามิเตอร์ code
  4. แอปใช้ 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 ไปยังเว็บไซต์ปลอมบนเครื่องตัวเองได้

ขั้นตอนการลงทะเบียน

  1. พอร์ทัลนักพัฒนา → รายการแอป → เปิดแอปเป้าหมาย
  2. คลิกปุ่ม「+ เพิ่ม」ในส่วน「redirect URI」
  3. กรอก URI แล้ว「บันทึก」
  4. ทำซ้ำตามจำนวนสภาพแวดล้อมที่ต้องการ

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 ของแอปที่กำลังทำงานอยู่ ให้ทำตามลำดับต่อไปนี้

  1. เพิ่ม URI ใหม่ (คง URI เดิมไว้)
  2. เปลี่ยนโค้ด/ตัวแปรสภาพแวดล้อมของแอปให้เป็น URI ใหม่แล้ว deploy
  3. ยืนยันการทำงานด้วย URI ใหม่
  4. ลบ URI เดิม

หากลบ URI เดิมทันที คำขออนุญาตที่เกิดขึ้นระหว่างช่วงที่ deploy ยังไม่เสร็จจะล้มเหลวทั้งหมด

คู่มือที่เกี่ยวข้อง

วันที่เผยแพร่: 2569-04-27 วันที่อัปเดต: 2569-07-05
แท็ก
API (22) OAuth (15) Android (10) iOS (9) Webhook (8) api (7) oauth (5) getting-started (4) การลงทะเบียนแอป (4) การแก้ปัญหา (4)
บทความที่เกี่ยวข้อง