Ory OAuth2 (Hydra)

Watchanon Numnam
2 min readFeb 21, 2023

มาลองทำ Authorization server (OAuth2) ด้วย oray oauth2 (hydra)

ก่อนจะเริ่มเล่นกัน มาลองทำความเข้าใจกันก่อนดีกว่าว่า Authentication vs Authorization ต่างกันอย่างไร

Authentication (AuthN) คือกระบวนการตรวจสอบคนหรืออะไรก็ตามว่าใช่คนๆนั้นหรือไม่ เช่น ระบบ Login ที่เรากรอก Ysername ก็ต้องมีอะไรมายืนยันว่า เราเป็นเจ้าของ Ysername นี้จริงไหม อย่างง่าย ก็ password ที่เราคุ้นเคย

Authorization (AuthZ) คือกระบวนการแยกแยก Permission ของคนหรืออะไรก็ตาม เพื่อจำแนกให้ได้ว่าเค้ามีสิทธิ์ตามที่ระบบต้องการหรือไม่ เช่น ถ้าเราเป็น User ธรรมดา ไม่มี Permission ในการดูเงินเดือนของพนักงานทั้งหมด ระบบก็ต้องไม่แสดงให้เราเห็น แต่หากเป็น HR Admin ที่เค้ามีสิทธิในการดูข้อมูลได้ ระบบก็ต้องแสดงให้เค้าเห็นได้

OAuth2 (RFC-6749) คือ Authorization Protocol เพื่ออนุญาติให้เข้าถึงกลุ่มข้อมูล (Resource) เช่น APIs หรือ User data

นอกเรื่องอีกนิด จริงๆการเข้าไปอ่าน RFC ก็ไม่ได้อ่านยากนะครับ อาจจะง่ายกว่าบทความที่เขียนๆกันในโลกออนไลน์อีก

Oauth2 ใช้ Access Token ซึ่งคือ ส่วนหนึ่งของดาต้าที่แสดงถึงการได้รับอนุญาติให้เข้าถึงข้อมูลต่างๆในฐานะของ User

โดยที่ Oauth2 ไม่ได้กำหนดหน้าตา (Format) ของ Access Token ว่าจะต้องเป็นเช่นได้ อาจจะเป็น hash ค่าๆนึง หรือ ส่วนมากมักใช้ JSON Web Format (JWT)

ส่วนประกอบใน Core Specification ของ OAuth2 แบ่งได้ตามนี้

  • Resource Owner (Authentication Server) คือระบบที่ grant access
  • Client คือ ระบบที่ต้องการเข้าถึงข้อมูลที่เราป้องกันไว้ โดยที่ Client ต้องถือ Access Token ก่อนถึงจะเรียกใช้ข้อมูลได้
  • Authorization Server คือ คือระบบที่สร้าง Access Token ให้ Client หลังจากที่ Authentication และ Consent จาก Resource Owner สำเร็จ
  • Resource Server คือระบบหรือข้อมูลที่ Client ต้องการข้อมูล โดยจะตรวจเช็ค Access Token จาก Client ก่อน ว่าถูกต้องถึงจะคืนข้อมูลที่ต้องการออกไป

โดนมาตรฐานของ OAuth2 มี Grant Typeดังนี้

  • Authorization Code
  • Implicit
  • Authorization Code Grant with Proof Key for Code Exchange (PKCE) ไปลองดูได้จากบทความนี้ https://medium.com/@iampae/proof-key-for-code-exchange
  • Resource Owner Password Credential
  • Client Credential
  • Device Authorization Flow
  • Refresh Token Grant

แล้ว Hydra คืออะไร

Hydra

คือ Opensource OAuth2 server ที่ implement ส่วนของการทำ Authorization โดยเปิดโอกาสให้เรา implement Authentication และ Consent ของเราได้เอง โดยที่ Hydra มีและไม่ implement Resource Owner Password Credential (ROPC)

เรื่องดราม่าเกิดขึ้นเพราะว่าองค์กรเก่าขนาดใหญ่ไม่ต้องการ Migrate Authentication Infrastructure ให้ทันสมัยเลยไปโหวดเพิ่ม Grant Type นี้เข้าไปใน IETF เพราะพวกเค้าก็อยู่ใน IETF consortium

โดย Flow การทำงานของ Hydra จะมีดังนี้

login flow
ory oauth2 & openid connect login flow
  1. เริ่มต้นจาก Client ยิง request ไปที่ Hydra server เพื่อทำการ auth โดยระบุ grant_type, client_id และ parameter ต่างๆตามที่ แต่ละ Grant ype ต้องการ
  2. จากนั้น Hydra server จะทำการ ตรวจสอบ Session ว่ามีค้างอยู่ไหมถ้าไม่มี ก็จะ redirect ไปยัง Login Endpoint ของเรา (เรา Implement login page เอง) โดยที่ จะส่ง query parameter ชื่อว่า “login_challenge” และค่า ไปให้หน้า Login Endpoint ของเราด้วย
  3. จากนั้น User ก็ทำการ Login เข้าระบบ แต่ระบบ Login ของเรา จะต้องนำค่า login_challenge ยิงกลับไปบอก Hydra server ด้วยว่า login_challenge นี้สำเร็จหรือไม่ และ Hydra server จะส่ง redirect_to กลับมาให้ Login Endpoint ของเรา Redirect user ต่อ
  4. User จะโดน Redirect ไปหน้า Consent Endpoint ที่เราสร้างขึ้นมาเอง โดยที่จะส่ง query parameter ชื่อว่า consent_challenge มาให้เราด้วยเหมือนกัน โดยเราสามารถนำ consent_challenge ไปดึงรายละเอียดของ Consent เพื่อมาให้ User ทำการเลือกได้ว่าจะให้ Consent กับ Scope ไหนบ้าง จากนั้นก็แสดงผลหน้าจอให้ User เห็น เมื่อ User ตกลง Consent Endpoint ก็ต้องนำ consent_challenge ยิงกลับไปบอกที่ Hydra server เพื่อให้ทราบว่า User ให้ Consent อะไรบ้าง จากนั้นจะได้ redirect_to กลับมา เพื่อให้ Consent Endpoint ทำการ redirect หน้าจอ User กลับไปตามที่กำหนดไว้ใน Config ของ Client ID น้ันๆ

จากนั้นก็เข้า Flow ปกติของ OAuth2 ซึ่งจะแตกต่างกันออกไปแต่ละ Grant Type

--

--