ปกป้อง API ด้วย AWS Cognito OAuth2 scopes (Part 2)

sc phai Jr.
4 min readJan 27, 2021

หลังจาก part 1 ที่เราได้ทำการสร้าง cognito เพื่อใช้สำหรับเป็น Authentication server แล้วนั้น ต่อมาเราจะมาทำการสร้าง Service อย่างง่ายด้วย Lambda เพื่อจำลอง Resource server ขึ้นมา ก่อนที่สุดท้ายเราจะมาประกอบร่างเข้าด้วยกันกับ Authentication server ในส่วนของ AWS API gateway

สร้าง Lambda function เพื่อจำลอง API

  • ทำการ login ไปที่หน้า AWS Management console จากนั้นก็ไปที่ Lambda service
  • เลือก “Create function” → เลือก “Blueprints” → เลือก “microservice-http-endpoint-python
  • หน้า Basic information ให้ทำการกรอกข้อมูลดังนี้
  • หน้า API Gateway trigger ให้ทำการกรอกข้อมูลดังนี้ เพื่อทำการสร้าง Rest API
  • เมื่อทำการกรอกข้อมูลครบแล้วก็ Click “Create function โลด

สร้าง Dynamo DB (NoSQL DB on AWS)

  • ขั้นตอนต่อมาเราจะมาทำการสร้าง table ใน dynamoDB เนื่องจากใน lambda function ของเราหากดูใน code จะเห็นว่า API เราจะ Provide api สำหรับแสดงข้อมูลของ table ใน dynamoDB
  • ไปที่ หน้า dynamoDB จากนั้นทำการสร้าง table มา ชื่ออะไรก็ได้ ในที่นี้ผมขอใส่ชื่อว่า student เพราะผมชอบเด็ก (นักเรียน)
  • ถ้าสร้างเสร็จก็จะเห็นว่ามี table ชื่อ student โผล่มา

ทดสอบ API

  • ทีนี้เราจะมาทดสอบ API ของเราดูซักหน่อยว่าสามารถทำงานได้ไหม
  • ไปที่ “API gateway” → “MyResourceAPI-API” → “Stages” → “dev” → “/MyResourceAPI” → “GET”
  • จะเห็นว่า API ของเราได้ถูก deploy ไปที่ stage “dev” และมี Invoke URL ให้แล้ว ให้เราทำการ Copy URL แล้วใส่ parameter TableName=<ชื่อ table ที่เราสร้างใน dynamoDB>
  • ทดสอบ GET ผ่าน Postman ก็จะได้ response กลับมาบอกว่า ยังไม่มีข้อมูลใน table “student”
  • ทำการเพิ่มข้อมูล student โดย สามารถใช้ URL เดิม โดยเปลี่ยน Method เป็น POST แล้วใส่ Json body หรือจะ Curl ก็ได้นะ
curl --location -g --request POST 'https://{{URL}}.execute-api.ap-southeast-1.amazonaws.com/dev/MyResourceAPI?TableName=student' --header 'Content-Type: application/json' --data-raw '{"TableName":"student","Item":{"student":{"S":"suttinai"},"id":{"S":"1"}}}'
  • ลอง GET ดูอีกซักครั้ง
  • ไหนๆก็เพิ่มแล้ว ลองมาลบดูหน่อยซิ โดยวิธีการก็เหมือนเพิ่มข้อมูลแต่ใช่ Method เป็น DELETE แล้วก็ระบุ Json body ไป
curl --location --request DELETE 'https://565dyljdq7.execute-api.ap-southeast-1.amazonaws.com/dev/MyResourceAPI?TableName=student' --header 'Content-Type: application/json' --data-raw '{"TableName":"student","Key":{"id":{"S":"1"}}}'
  • ลอง GET ดูจะเห็นว่าข้อมูลที่เราได้เพิ่มไป ได้หายไปแล้ว

กลับมาที่หน้า API gateway ของเรา จะเห็นว่าใน Resource จะมีการ Auto สร้าง method ให้เราทั้งหมด (ANY) เราจะมาทำการลบออกก่อนแล้วค่อยเพิ่ม Method GET POST DELET ไปใหม่ เนื่องจากว่าเราจะทำการเพิ่ม Oauth2 ให้กับ API เรา

  • ลบ Method “ANY”
  • เพิ่ม Method GET ไปที่ Actions → Create method แล้วระบุเป็น Method GET

ในหน้า Method Request ระบุข้อมูลดังนี้

ในหน้า Integration Request ระบุข้อมูลดังนี้

  • เพิ่ม Method POST ทำเหมือนกันเปลี่ยนแค่ชือ Method

ในหน้า Method Request ระบุข้อมูลดังนี้

ในหน้า Integration Request ระบุข้อมูลดังนี้

  • เพิ่ม Method DELETE ทำเหมือนกันเปลี่ยนแค่ชือ Method

ในหน้า Method Request ระบุข้อมูลดังนี้

ในหน้า Integration Request ระบุข้อมูลดังนี้

  • ทำการ Deploy api ของเราอีกครั้งโดยเลือก Actions → Deploy API เลือก Deployment stage “dev”

ทำการเพิ่ม Oauth2 ให้กับ API

  • ในหน้า API gateway ให้ไปที่ Authorizers แล้วทำการ Create New Authorizer โดยระบุรายละเอียดดังนี้
  • ทำการเพิ่ม Authorizer ให้กับ API เรา โดบเริ่มจาก Method GET ก่อน

(แนะนำให้ refresh หน้าจอก่อน ไม่งั้นจะหา Authorizer ที่เราเพิ่มไปไม่เจอ)

  • ทำการเพิ่ม Authorizer ให้กับ API เรา Method POST
  • ทำการเพิ่ม Authorizer ให้กับ API เรา Method DELETE
  • เมื่อเสร็จแล้วให้ทำการ Deploy API อีกครั้ง

ทดสอบบบ

  • ลองเรียกไปที่ Method GET ที่เราเคยเรียกได้

จะเห็นว่าตอนนี้ API ของเราไม่สามารถเรียกใช้งานได้แล้วเนื่องจากเราได้ทำการเพิ่ม Authorize server เข้าไป โดย Response ที่ได้จะเป็น status 401ตามภาพ

  • ทำการเพิ่ม Authorization แบบ Oauth2 โดย Postman เองก็มี feature ให้เราเรียกใช้งานได้ง่ายๆ โดยไปที่ Tab Authorization แล้วก็ระบุค่าต่างๆเหมือนที่เคยทำไปใน Part 1 จากนั้นลองเรียก Method Get อีกครั้ง

ในรอบนี้เรามีการส่ง token ไปใน Header Key “Authorization” ซึ่งถ้าไม่มีอะไรผิดพลาดก็จะได้ Response http status 200

ทดสอบ Method POST

ทดสอบ Method DELET

อื้มมม แก๋ววว

ก็จบลงไปกับการทำ Oauth2 โดยการใช้ AWS cognito ในการทำ Authorization server หวังว่าเพื่อนๆจะได้ความรู้ไม่มากก็ไม่ได้เลย (ผ่าม) สุดท้ายก็ขอให้ทุกท่านมีความสุขกับชีวิต ระวังโควิดกันด้วย บัย

สวัสดี

--

--