ทำความเข้าใจ oauth ด้วย golang

มันคาใจมานานมากว่า oauth มันทำงานยังไงกันแน่ เลยได้ไปไล่อ่านบทความมากมายจนพอจะเข้าใจคร่าวๆว่า มาตรฐาน oauth มันมี version 1.0 กับ 2.0 ซึ่งไม่ได้แปลว่า 2.0 จะใหม่กว่า มันเชิงจะเป็นคนละมาตรฐานซะมากกว่า ซึ่งวันนี้จะขอกล่าวถึง oauth 2.0 ซึ่ง ก็แบ่งเป็น grant type 4 ชนิดคือ
1. authorization code
2. resource owner password credentials
3. client credentials
4. implicit

ที่ผมทำการทดลองกับ google จะเป็นแบบที่ 1. ซึ่ง flow จะเป็นดังนี้

sequence diagram
  1. web request login to api
  2. api ส่ง request ไป oauth ของ google พร้อมกับ callback uri ที่จะให้ google ส่ง code กลับมาให้ ซึ่งเราจะต้องบอกไปด้วยว่า จะต้องการเข้าถึงบริการอะไรของ google บ้าง ซึ่งจะสัมพันธ์กับสิทธิ์ที่เรากำหนดให้กับ client_id ที่เราไปสร้างไว้กับ google
  3. google จะส่ง authorization code กลับมาที่ callback ที่บอกไปในข้อ 2.
  4. api รับ code ที่ google ส่งมาให้ในข้อ 3. แล้วเอา code นี้ส่งไปที่ google อีกทีเพื่อขอ access token
  5. ถ้าไม่มีอะไรผิดพลาด google จะส่ง access token กลับมาให้
  6. เอา access token ที่ได้ไปยิง api ต่างๆของ google ที่เราบอกสิทธิ์ไว้ในข้อ 2.

ตัวอย่าง code ที่เอามาทดลองได้มาจากนี่
https://jacobmartins.com/2016/02/29/getting-started-with-oauth2-in-go/
แต่นำมาเขียนใหม่ เพราะอยากใช้ echo
https://github.com/pallat/oauthback

ก่อนจะเอา code นี้ไปรัน ต้องไปสร้าง client id ไว้ที่ google ก่อนนะครับ ที่ https://console.developers.google.com แล้วเอา client id มาใส่ใน env googlekey กับ client secret มาใส่ไว้ที่ googlesecret

สุดท้ายการจัดการกับ token ที่ได้มานั้น มันจะมีเวลาหมดอายุส่งกลับมาให้ด้วย ซึ่งน่าจะอยู่ราวๆ 1 ชั่วโมง แล้วเราก็จะได้ refresh token กลับมาด้วย ไว้ใช้ขอ access token ใหม่เมื่อมันหมดอายุ

อันนี้เป็นแค่การพยายามทำความเข้าใจเบื้องต้นว่ามันทำงานอย่างไร ด้วยตัวเองนะครับ ผิดพลาดประการใดก็ขออภัยด้วย
ส่วนใครที่สงสัยว่าจะสร้าง client id ได้อย่างไร ลองหาวิธีด้วยตัวเองดูก่อนนะครับ แต่ถ้าไม่ได้จริงๆก็ถามมาได้ครับ ยินดีให้คำแนะนำ

Like what you read? Give Pallat Anchaleechamaikorn a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.