DEV Community

Cover image for สอน OpenID Connect ฉบับสมบูรณ์: คู่มือทีละขั้นตอน
Thanawat Wongchai
Thanawat Wongchai

Posted on • Originally published at apidog.com

สอน OpenID Connect ฉบับสมบูรณ์: คู่มือทีละขั้นตอน

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

ทดลองใช้ Apidog วันนี้

OpenID Connect คืออะไร? (พื้นฐานบทช่วยสอน OpenID Connect)

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

ทำไม OpenID Connect ถึงสำคัญ?

  • การยืนยันตัวตนที่ปลอดภัย: หลีกเลี่ยงระบบเข้าสู่ระบบที่สร้างขึ้นเองซึ่งไม่ปลอดภัย
  • การเข้าสู่ระบบครั้งเดียว (SSO): ผู้ใช้สามารถเข้าสู่ระบบหลายแอปพลิเคชันโดยใช้ผู้ให้บริการยืนยันตัวตนเพียงรายเดียว
  • ความเข้ากันได้: ทำงานได้กับไคลเอ็นต์เว็บ, มือถือ และ API
  • ข้อมูลโปรไฟล์: ส่งคืนข้อมูลตัวตนและโปรไฟล์ในรูปแบบมาตรฐาน (โทเค็น JWT ID)

ในบทช่วยสอน OpenID Connect นี้ คุณจะได้เรียนรู้ว่าประโยชน์ทั้งหมดเหล่านี้เกิดขึ้นได้อย่างไร ทีละขั้นตอน

แนวคิดหลักสำหรับบทช่วยสอน OpenID Connect นี้

ก่อนเริ่มลงมือ ให้ทำความเข้าใจองค์ประกอบสำคัญของ OpenID Connect:

  • ผู้ให้บริการยืนยันตัวตน (IdP): บริการที่ยืนยันตัวตนผู้ใช้ เช่น Google, Auth0, Okta
  • ไคลเอ็นต์ (Relying Party): แอปพลิเคชันที่ขอการยืนยันตัวตน (เว็บ, มือถือ หรือ API ของคุณ)
  • ผู้ใช้ปลายทาง: บุคคลที่ต้องยืนยันตัวตน
  • เซิร์ฟเวอร์การอนุญาต: ปกติคือ IdP ที่ออกโทเค็นเมื่อยืนยันตัวตนสำเร็จ
  • ID Token: JSON Web Token (JWT) ที่มีข้อมูลตัวตนผู้ใช้
  • Access Token: (จาก OAuth 2.0) สำหรับเข้าถึง API หลังยืนยันตัวตน
  • Discovery Document: URL ที่ให้เมตาดาต้าและ endpoint ต่างๆ สำหรับยืนยันตัวตน

บทช่วยสอน OpenID Connect: อธิบายขั้นตอนการยืนยันตัวตน

นี่คือขั้นตอนการยืนยันตัวตนด้วย OpenID Connect แบบทีละขั้นตอน:

1. ผู้ใช้เริ่มต้นการเข้าสู่ระบบ

ผู้ใช้คลิกปุ่ม "เข้าสู่ระบบด้วย OpenID Connect" ในแอปของคุณ

2. ไคลเอ็นต์เปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์การอนุญาต

แอปของคุณ redirect เบราว์เซอร์ไปยัง authorization endpoint ของ IdP พร้อมพารามิเตอร์:

  • client_id
  • redirect_uri
  • scope (ต้องมี openid)
  • state
  • response_type (เช่น code สำหรับ Authorization Code flow)

ตัวอย่าง URL:

https://idp.example.com/authorize?
  client_id=YOUR_CLIENT_ID
  &redirect_uri=https://yourapp.com/callback
  &scope=openid%20profile%20email
  &response_type=code
  &state=randomState123

3. ผู้ใช้ยืนยันตัวตน

ผู้ใช้กรอกข้อมูลเข้าสู่ระบบที่ IdP และยินยอมแบ่งปันโปรไฟล์

4. เซิร์ฟเวอร์การอนุญาตเปลี่ยนเส้นทางกลับ

IdP redirect ไปยัง redirect_uri ของคุณ พร้อม authorization code และ state

ตัวอย่าง:

https://yourapp.com/callback?code=AUTH_CODE&state=randomState123

5. ไคลเอ็นต์แลกเปลี่ยนรหัสเพื่อรับโทเค็น

Backend ส่ง POST ไปยัง token endpoint ของ IdP เพื่อแลก code เป็นโทเค็น

POST /token
Host: idp.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=AUTH_CODE
&redirect_uri=https://yourapp.com/callback
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET

6. โทเค็นถูกส่งคืน

IdP ส่งกลับ:

  • id_token (JWT)
  • access_token
  • (ถ้ามี) refresh_token

ตัวอย่าง Response JSON:

{
  "access_token": "eyJ...abc",
  "id_token": "eyJ...xyz",
  "expires_in": 3600,
  "token_type": "Bearer"
}

7. ไคลเอ็นต์ตรวจสอบและใช้โทเค็น

แอปตรวจสอบ id_token (ลายเซ็น, aud, exp) และเข้าสู่ระบบผู้ใช้ สามารถใช้ access_token เรียก API ได้

บทช่วยสอน OpenID Connect: การทำความเข้าใจโฟลว์

OpenID Connect มีหลายโฟลว์ บทช่วยสอนนี้เน้น Authorization Code Flow (เหมาะกับเว็บแอป):

Authorization Code Flow (แนะนำสำหรับเว็บแอป)

  • ปลอดภัยสูง (โทเค็นไม่ถูกเปิดเผยในเบราว์เซอร์)
  • ตรวจสอบฝั่งเซิร์ฟเวอร์
  • เหมาะกับ client ที่มี backend

หลีกเลี่ยง Implicit Flow: ไม่แนะนำเพราะโทเค็นถูกเปิดเผยใน URL ใช้ Authorization Code Flow + PKCE สำหรับ SPA/mobile

บทช่วยสอน OpenID Connect: การถอดรหัส ID Token

id_token คือ JWT ที่เก็บข้อมูลผู้ใช้ ถอดรหัสเพื่อตรวจสอบและใช้งานได้เลย

ตัวอย่าง payload:

{
  "iss": "https://idp.example.com",
  "sub": "1234567890",
  "aud": "YOUR_CLIENT_ID",
  "exp": 1712345678,
  "iat": 1712341678,
  "email": "user@example.com",
  "name": "Jane Doe"
}
  • iss: ผู้ออก (IdP)
  • sub: ผู้ใช้
  • aud: Client ID
  • exp: วันหมดอายุ
  • email, name: ข้อมูลผู้ใช้

ข้อควรระวัง: ตรวจสอบลายเซ็นและข้อมูลใน id_token ทุกครั้งก่อนใช้งาน

บทช่วยสอน OpenID Connect: ตัวอย่างการปฏิบัติ (Python)

ดูตัวอย่างการ implement OpenID Connect แบบไม่ใช้ SDK ด้วย Python:

ขั้นตอนที่ 1: สร้าง URL การอนุญาต

import urllib.parse

params = {
    "client_id": "YOUR_CLIENT_ID",
    "redirect_uri": "https://yourapp.com/callback",
    "response_type": "code",
    "scope": "openid profile email",
    "state": "randomState123"
}
auth_url = "https://idp.example.com/authorize?" + urllib.parse.urlencode(params)
print(auth_url)

ขั้นตอนที่ 2: แลกเปลี่ยนรหัสการอนุญาตเพื่อรับโทเค็น

import requests

token_data = {
    "grant_type": "authorization_code",
    "code": "AUTH_CODE",
    "redirect_uri": "https://yourapp.com/callback",
    "client_id": "YOUR_CLIENT_ID",
    "client_secret": "YOUR_CLIENT_SECRET"
}
resp = requests.post("https://idp.example.com/token", data=token_data)
tokens = resp.json()
print(tokens)

ขั้นตอนที่ 3: ถอดรหัสและตรวจสอบ ID Token

import jwt

id_token = tokens['id_token']
decoded = jwt.decode(id_token, options={"verify_signature": False})
print(decoded)

หมายเหตุ: ในการใช้งานจริง ต้องตรวจสอบลายเซ็นด้วย public key ของ IdP ทุกครั้ง!

บทช่วยสอน OpenID Connect: สถานการณ์การใช้งานจริง

1. การเข้าสู่ระบบครั้งเดียว (SSO) ข้ามหลายแอปพลิเคชัน

ให้ผู้ใช้ล็อกอินเพียงครั้งเดียว (เช่น Google) แล้วใช้งานได้ทุกแอปในระบบของคุณได้ทันที

2. การยืนยันตัวตน API ที่ปลอดภัย

ตรวจสอบ id_token ใน backend API ทุกครั้ง เพิ่มความปลอดภัยให้ API ของคุณ เครื่องมืออย่าง Apidog ช่วยออกแบบ/ทดสอบ endpoint ที่ปลอดภัยได้รวดเร็ว

3. การรวมการเข้าสู่ระบบโซเชียล

อยากได้ "เข้าสู่ระบบด้วย Google/Microsoft"? แค่ implement ตามขั้นตอนข้างต้น ก็เชื่อม IdP เหล่านั้นได้ทันที

4. การยืนยันตัวตนแอปพลิเคชันมือถือ

ใช้โฟลว์เดียวกันกับ mobile app ได้เลย (ผ่าน deep link หรือ in-app browser)

บทช่วยสอน OpenID Connect: การทดสอบและแก้ไขข้อบกพร่องด้วย Apidog

การทดสอบและ debug OpenID Connect integration สำคัญมาก Apidog เป็น แพลตฟอร์มพัฒนา API ที่ขับเคลื่อนด้วยสเปก สำหรับงานนี้โดยเฉพาะ

  • ทดสอบ API request: ใช้ UI ของ Apidog จำลอง request/token flow และดู response ได้ทันที
  • จำลอง endpoint: สร้าง IdP จำลองใน Apidog เพื่อเทสต์การยืนยันตัวตนโดยไม่ต้องพึ่ง IdP จริง
  • จัดทำเอกสาร API: สร้างเอกสาร API ที่รองรับ OpenID Connect ใน Apidog ช่วยให้ทีม dev และ security ทำงานร่วมกันง่ายขึ้น

นำ Apidog มาใช้กับ workflow OpenID Connect ช่วยให้พัฒนาเร็วขึ้น ลดข้อผิดพลาด และมั่นใจว่าการยืนยันตัวตนของคุณแข็งแกร่ง

บทช่วยสอน OpenID Connect: แนวปฏิบัติที่ดีที่สุด

  • ตรวจสอบ id_token ทุกครั้ง: เช็คลายเซ็น, iss, aud, exp
  • ใช้ HTTPS ตลอดเวลา: ห้ามส่งโทเค็นผ่านช่องทางไม่ปลอดภัย
  • เก็บข้อมูลลับให้ปลอดภัย: เก็บ client_secret และโทเค็นอย่างปลอดภัย
  • จัดการ error ดีๆ: handle login fail, token หมดอายุ, session ถูกยกเลิก
  • อัปเดตความรู้และไลบรารี: OpenID Connect พัฒนาเรื่อยๆ ควรใช้เวอร์ชันล่าสุดเสมอ

สรุป: ขั้นตอนถัดไปหลังจากบทช่วยสอน OpenID Connect นี้

คุณได้เรียนรู้ทั้งโฟลว์, การ implement, โค้ดตัวอย่าง และแนวปฏิบัติที่ดีที่สุดสำหรับ OpenID Connect แล้ว

ขั้นตอนถัดไป:

  1. ลงทะเบียนแอปกับ IdP (Google, Auth0, Okta หรือ IdP ของคุณเอง)
  2. นำ Authorization Code Flow ไปใช้ อ้างอิงขั้นตอนในบทความนี้
  3. ทดสอบโฟลว์ ด้วย Apidog เพื่อความมั่นใจในความปลอดภัย
  4. ต่อยอด ศึกษา Discovery, Dynamic Client Registration, federated identity เพิ่มเติม

บทช่วยสอนนี้ช่วยให้คุณพร้อมสร้างระบบยืนยันตัวตนที่ปลอดภัยและทันสมัยในแอปใดก็ได้ ขอให้สนุกกับการ coding!

Top comments (0)