项目作者: juusechec

项目描述 :
Una implementación simple de dgrijalva/jwt-go para beego. A simple implementation of dgrijalva/jwt-go for beego.
高级语言: Go
项目地址: git://github.com/juusechec/jwt-beego.git
创建时间: 2016-09-18T22:56:39Z
项目社区:https://github.com/juusechec/jwt-beego

开源协议:MIT License

下载


Build Status
Go Report Card
GoDoc Reference
Coverage Status

You can read Docs in english.

jwt-beego

Una implementación simple de dgrijalva/jwt-go para beego.

Pasos para implementar:

1) Crear una llave RSA con los comandos de generar_key.log

2) Generar una ruta con action POST en el controlador especificado, en este caso la ruta elegida fue /user/getToken:

  1. // ./controllers/user.go
  2. package controllers
  3. import (
  4. ...
  5. "github.com/juusechec/jwt-beego"
  6. )
  7. ...
  8. // @Title getToken
  9. // @Description Get token from user session
  10. // @Param username query string true "The username for get token"
  11. // @Param password query string true "The password for get token"
  12. // @Success 200 {string} Obtain Token
  13. // @router /getToken [post]
  14. func (u *UserController) GetToken() {
  15. username := u.Ctx.Input.Query("username")
  16. password := u.Ctx.Input.Query("password")
  17. tokenString := ""
  18. if username == "admin" && password == "mipassword" {
  19. et := jwtbeego.EasyToken{
  20. Username: username,
  21. Expires: time.Now().Unix() + 3600, //Segundos
  22. }
  23. tokenString, _ = et.GetToken()
  24. }
  25. u.Data["json"] = "{'tokenString': '" + tokenString + "'}"
  26. u.ServeJSON()
  27. return
  28. }
  29. ...

3) Agregar la validación del token en cada controlador que se necesite. Esto se hace a través de la función Prepare.

  1. // ./controllers/my_restricted_controller.go
  2. package controllers
  3. import (
  4. ...
  5. "github.com/juusechec/jwt-beego"
  6. )
  7. func (c *TipoCancelacionSemestreController) Prepare() {
  8. tokenString := c.Ctx.Input.Query("tokenString")
  9. // O puede ser leído de una cabecera HEADER!!
  10. // tokenString := c.Ctx.Request.Header.Get("X-JWTtoken")
  11. et := jwtbeego.EasyToken{}
  12. valido, _, _ := et.ValidateToken(tokenString)
  13. if !valido {
  14. c.Ctx.Output.SetStatus(401)
  15. c.Data["json"] = "Permission Deny"
  16. c.ServeJSON()
  17. }
  18. return
  19. }
  20. ...

Con esto ya estaría terminado, pero si se quiere hacer que todos los controladores tengan la misma validación se puede hacer:

1) Configurar un nuevo paquete.

  1. //./myBeego/controller.go
  2. //Se crea un espacio de nombres llamado myBeego
  3. package myBeego
  4. //Se agrega la biblioteca de beego
  5. import (
  6. ...
  7. "github.com/astaxie/beego"
  8. )
  9. //Se genera un tipo Controller que hereda de beego.Controller
  10. type Controller struct {
  11. beego.Controller
  12. }
  13. //Se redefine lo que hace la función Prepare
  14. //* es un apuntador al igual que en C
  15. //& hace referencia a la dirección de memoria
  16. //La iniciación de una variable o funcion con * se traduce en que almacena
  17. //u := 10 //var z *int //z = &u //fmt.Println(z)//0x1040e0f8
  18. //var s *string //var r **string = &s //fmt.Println(r)//0x1040a120
  19. func (c *Controller) Prepare() {
  20. //Lo que quieras hacer en todos los controladores
  21. tokenString := c.Ctx.Input.Query("tokenString")
  22. // O puede ser leído de una cabecera HEADER!!
  23. // tokenString := c.Ctx.Request.Header.Get("X-JWTtoken")
  24. et := jwtbeego.EasyToken{}
  25. valido, _, _ := et.ValidateToken(tokenString)
  26. if !valido {
  27. c.Ctx.Output.SetStatus(401)
  28. c.Data["json"] = "Permission Deny"
  29. c.ServeJSON()
  30. }
  31. return
  32. }

2) Configurar llamado del nuevo Controller en todos los controladores:

  1. //./controllers/miObjeto.go
  2. package controllers
  3. import (
  4. ...
  5. "github.com/juusechec/jwt-beego-implementation/myBeego"
  6. "github.com/juusechec/jwt-beego"
  7. )
  8. type MiObjetoController struct {
  9. //beego.Controller
  10. myBeego.Controller
  11. }
  12. ...

Ejemplo de uso:

Se basa en: