Golang x JWT

Nokkii
Tech INNO
Published in
2 min readApr 26, 2021
https://learn.vonage.com/blog/2020/03/13/using-jwt-for-authentication-in-a-golang-application-dr/

ก่อนอื่นเรามาทำความรู้จัก JWT คืออะไร

https://jwt.io/introduction/

JSON Web Token (JWT) เป็น open standard (RFC 7519) ที่มีขนาดกระทัดรัดและสามารถเก็บข้อมูลภายในตัว

โดยจะประกอบไปด้วย 3 ส่วน

  • Header โดยทั่วไป Header ประกอบด้วยสองส่วนคือประเภทของ Token ซึ่งก็คือ JWT และอัลกอริทึ่มที่ใช้ใน verify เช่น HMAC SHA256 หรือ RSA
  • Payload ส่วนนี้เป็นข้อมูลที่ต้องการส่ง โดย Predefined ที่แนะนำจะประกอบไปด้วย iss (issuer), exp (expiration time), sub (subject), aud (audience)
  • Signature จะใช้ในการ Verify JWT นั้นถูกต้องหรือไม่โดยการเลือกอัลกอริทึ่มใช้จะมาจาก Header หากมีการแก้ไข Payload ระหว่างทางจะทำให้ Verify Signature ไม่ผ่าน

แล้วเราจะเริ่มเขียน JWT ด้วยภาษา Go อย่างไรดีนะ … มาเริ่มกันเลยยยยยยยย

ตัวอย่าง การ Generate และ Verify JWT ด้วยอัลกอริทึ่ม RSA256

  1. ทำการ generate Key ผ่าน Web online หรือใช้ command generate rsa
https://travistidwell.com/jsencrypt/demo/

2. สร้าง Folder cert และ สร้างไฟล์ id_rsa, id_rsa.pub โดย file id_rsa มีข้อมูล Public key และ id_rsa.pub มีข้อมูล Public key

3. สร้างไฟล์ main.go

4. สร้าง Folder token และ File token.go

จากตัวอย่าง เราสามารถ เลือกอัลกอริทึ่ม RSA256 โดยใช้ jwt.SigningMethodRS256 หรือ RSA512 jwt.SigningMethodRS512

jwt.NewWithClaims(jwt.SigningMethodRS256, claims).SignedString(key)
jwt.NewWithClaims(jwt.SigningMethodRS512, claims).SignedString(key)
https://pkg.go.dev/github.com/dgrijalva/jwt-go#Parser.Parse
https://pkg.go.dev/github.com/dgrijalva/jwt-go#Parser.Parse

ตัวอย่าง การ Generate และ Verify JWT ด้วยอัลกอริทึ่ม SHA256

  1. สร้างไฟล์ main.go

2. สร้าง Folder sha และ file sha.go

กรณีที่ Token Expire

Reference
http://www.inanzzz.com/index.php/post/kdl9/creating-and-validating-a-jwt-rsa-token-in-golang

github.com/dgrijalva/jwt-go

https://pkg.go.dev/github.com/dgrijalva/jwt-go

--

--