การยืนยันตัวตนและการกำหนดสิทธิ์ Apache UserGrid 2.x

ติดตั้ง UserGrid เสร็จแล้ว ถ้าจะใช้งานต้องทำอย่างไร

             จากที่เคยกล่าวไปแล้วเบื้องต้นในวิธีติดตั้ง Apache UserGrid [1][2] จะมี Port สำหรับเรียกด้วย Rest Service คือ port 8080 ส่วนหน้าสำหรับบริหารจัดการจะเป็น 80 ซึ่งเบื้องต้นจะไม่ใช่ ssl ถ้าต้องการความปลอดภัยต้องไปปรับแต่งเพิ่มเติม (ถ้าใช้ ha-proxy ก็ทำ ssl เฉพาะด้านหน้าก็ได้ครับ) โดยอาจจะต้องปรับแต่งที่ตัว Tomcat อ่านเพิ่มเติมได้ที่ https://usergrid.apache.org/docs/installation/ug1-deploy-to-tomcat.html 

             ในส่วนของบทความต่อไปนี้จะกล่าวถึง Authentication และ Permission ซึ่งรายละเอียดทั้งหมดอยู่ใน Web Usergrid : https://usergrid.apache.org/docs/security-and-auth/app-security.html

               โดยระบบยืนยันตัวตนของ UserGrid จะใช้ OAuth 2.0 ซึ่งสรุปสั้น ๆ คือ Client ขอตั๋วเข้าใช้งาน (Token) โดยได้หลังจากยืนยันตัวตน จากนั้น Server ก็จะให้ตั๋วมาเมื่อยืนยันว่าเป็นตัวจริง จากนั้น Client ก็เอาตั๋วไปยื่นขอใช้งานระบบต่าง ๆ ต่อ โดยมีอีก 3 สิ่งที่ต้องรู้ดังนี้
– Groups : คือการกำหนดกลุ่มของ User เพื่อกำหนดสิทธิ์ให้กลุ่ม แทนที่ต้องมากำหนดสิทธิ์ให้ทีละคน
– Roles : คือการกำหนดสิทธิ์ว่าให้เข้าถึง Resource ใดได้บ้าง (User Profile, Application Data) ซึ่งสิ่งนี้จะเป็นตัวที่ต้องกำหนดให้แต่ละคน หรือแต่ละ Group
– Permission : เมื่อมีสิทธิ์ใน Resource นั้นแล้วจะมีสิทธิ์ทำอะไรกับ Resource นั้นบ้าง (Select, Insert, Delete, Update)
สำหรับการจัดการ Group, Role, Permission สามารถจัดการผ่าน Rest API ได้หมด แต่ในตัวอย่างที่จะเสนอจะทำการจัดการผ่าน UserGrid Admin Portal ดังนี้

ตัวอย่างการเพิ่ม User ใหม่เข้าไปยัง Application ที่ต้องการ
1) เลือก Application ที่ต้องการ จากนั้นเลือก User และกดปุ่มเพิ่ม

2) กรอกรายละเอียดจากนั้นกด Create (รหัสผ่านเงื่อนไขเยอะจะตั้งยากหน่อย)

ตัวอย่างการเพิ่มบัญชี test01 เข้าไปอยู่ใน Group CCStaffs

1) สร้าง Group CCStaffs ขึ้นมาก่อน ดังรูป

  

2) ทำการเพิ่ม User เข้าไปยัง Groups ซึ่งจริง ๆ แล้วทำได้ 2 แบบ คือ เข้าไปที่ User แล้วเพิ่ม Group หรือ เข้าไปที่ Group แล้วเพิ่ม User ดังรูป


ตัวอย่างการเพิ่มบัญชี test01 เข้าไปอยู่ใน Role Guest
1) เบื้องต้นจะมี Role ให้เลือก 3 Role แต่จะเลือก Role Guest ซึ่งจริง ๆ แล้วเป็นเหมือน Permission Template เพราะเราสามารถกำหนดสิทธิ์เพิ่มเติมนอกเหนือที่ระบุใน Role ได้อีกในภายหลัง (GET=Select,POST=Insert,PUT=Update,DELETE=Delete)

2) ทำการเพิ่ม User เข้าไปยัง Roles ที่ต้องการ

               ในส่วนของ DATA เมนูจะใช้ในการจัดการข้อมูล กล่าวง่าย ๆ คือ Database ของ App ซึ่งทั้งระบบ UserGrid จะเก็บเป็น Cassandar NoSQL Database ดังที่กล่าวไว้ในตอนก่อนหน้า โดยการเรียกใช้งาน หรือ Update ข้อมูลจะใช้ในรูปแบบ JSON ซึ่งเราสามารถ สร้าง แก้ไข ลบข้อมูลผ่าน Usergrid Admin Portal หรือจะทำผ่าน Rest API ก็ได้ แต่ถ้าผ่าน Rest API จะได้สิทธิ์ตาม Permission ที่ตั้งไว้

               ในส่วนต่อไปจะกล่าวถึงวิธีการเรียก Authentication ผ่าน OAuth2 โดยจะทดสอบเรียกผ่าน curl (จะเรียกผ่าน Postman plugin chrome ก็ได้ครับ ตามสะดวกครับ) ก่อนอื่นมาทราบกันก่อนครับว่าเราจะยืนยันสิทธิ์แบบใดได้บ้าง (Organization->Application->User จากใหญ่ไปย่อย ๆ)

  • Application user : ใช้สิทธิ์ตามที่กำหนดในแต่ละ User
  • Application client : ให้สิทธิ์ทุกอย่างภายใต้ Application นั้น ๆ
  • Organization client : ให้สิทธิ์ทุกอย่างภายใต้ Organization นั้น ๆ
  • Admin user : ให้สิทธิ์ทุกอย่างในทุก ๆ Organization และ และ ทุก ๆ Application

ตัวอย่างการเรียกใช้แบบ User Authentication (User Login)

  • ทำการเรียกผ่าน curl โดยต้องใส่ username และ password เข้าไปด้วย
curl -X POST "https://api.usergrid.com/my-org/my-app/token" -d '{"grant_type":"password", "username":"john.doe", "password":"testpw"}'

  • ซึ่งเราสามารถนำ access_token เพื่อใช้ในการเข้าถึง path ต่าง ๆ ได้แล้ว แต่จะมีเวลา แค่ 604800 (24ชม.) สำหรับ token ดังกล่าว (วิธีเปลี่ยนลองถาม Google ดูครับ) ยกตัวอย่างต้องการดู User ทั้งหมดรวมทั้ง Profile ของทั้ง Application สามารถสั่งได้ดังนี้ (สามารถใส่ token ไปใน Header เลยก็ได้ ศึกษาเพิ่มเติมได้ที่ https://usergrid.apache.org/docs/security-and-auth/authenticating-api-requests.html)
curl -X GET "https://api.usergrid.com/my-org/my-app/users?access_token=[access-token]"

  • จะเห็นว่าระบบฟ้องว่าเราไม่มีสิทธิ์ ซึ่งถ้าเราย้อนกลับไปดู Role Guest จะพบว่าเราไม่มีสิทธิ์ในการ GET ค่า path /users  ให้ทำการเพิ่มสิทธิ์ใน Permission ก่อน

  • ลองเรียกอีกครั้งจะได้ดังนี้

ตัวอย่างการเรียกใช้แบบ Organization client authentication (ไม่แนะนำให้ใช้กับ Client->Server เหมาะกับ Server->Server มากกว่า)

  • จะต่างกับ User Authentication ตรงที่แทนที่จะส่ง User Password แต่จะส่ง Client ID และ Secret เพื่อขอ token แทน โดยจะได้สิทธิ์ทั้งหมดใน Application นั้น ๆ
    curl -X POST "https://api.usergrid.com/my-org/my-app/token" -d '{"grant_type":"client_credentials", "client_id":"[client-id]", "client_secret":"[client-secret]"}'
  • โดยเราสามารถดู Client ID และ Secret ได้ดังนี้

  • จากนั้นทดสอบขอ token ดังนี้

             สำหรับการ Authentication แบบ Application นั้นค่อนข้างจะยุ่งยากกว่า ยังหาไม่ได้จาก Usergrid Admin Portal ต้องเรียกผ่าน curl ตั้งแต่สร้าง ถ้าใครจะศึกษาเพิ่มเติมหาได้ที่นี่ https://usergrid.apache.org/docs/orgs-and-apps/application.html (ผมขอยอมแพ้ในขั้นนี้)

             ในการ Logout จะใช้วิธีการ Revoke token นั่นคือการทำให้ token หมดอายุนั่นเอง สามารถทำได้ง่าย ๆ ดังนี้

curl -X PUT https://api.usergrid.com/your-org/your-app/users/someUser/revoketokens

ตัวอย่างการเรียกใช้ Rest Service เพื่อ Logout

ขอจบเพียงเท่านี้ก่อนครับ นี่ขนาดยังไม่เอาไปใช้จริงนะครับ (เห็นแล้วจะมีใครอยากใช้ไหมเนี้ย 555)

=================================================

References :
[1] https://sysadmin.psu.ac.th/2017/04/07/usergrid-docker-containner/

[2] https://usergrid.apache.org/docs