整合dxvgef/token实现JWT功能

dxvgef/token包仿照JWT的原理实现了一种Token算法,以下是与HTTP Dispatcher整合的示例:

  1. package main
  2.  
  3. import (
  4. "github.com/dxvgef/httpdispatcher"
  5. "net/http"
  6. "log"
  7. "github.com/dxvgef/token"
  8. )
  9.  
  10. //定义token的结构体
  11. type TokenClaims struct {
  12. UserID int64
  13. token.ClaimsAttr
  14. }
  15.  
  16. //签名密钥
  17. const key string = "secret"
  18.  
  19. func main() {
  20. //定义claims
  21. var claims TokenClaims
  22. claims.UserID = 123
  23. //生成一个测试用的token
  24. tokenStr, err := token.NewString(claims, key)
  25. if err != nil {
  26. log.Println(err.Error())
  27. return
  28. }
  29. log.Println("测试Token:"+tokenStr)
  30.  
  31. //获得一个调度器的实例化对象
  32. var dispatcher = httpdispatcher.New()
  33.  
  34. //在入口路由里传入token验证处理器
  35. router := dispatcher.Router.GROUP("/secret", func(ctx *httpdispatcher.Context) error {
  36. //解析token字符串,得到token对象
  37. tk, err := token.Parse(tokenStr, &TokenClaims{}, key)
  38. if err != nil {
  39. return ctx.Event(err)
  40. }
  41.  
  42. //将claims断言成*token.TokenClaims类型
  43. claims := tk.Claims.(*TokenClaims)
  44.  
  45. //检查token是否有效
  46. if claims.Valid() == false {
  47. ctx.ResponseWriter.WriteHeader(401)
  48. ctx.ResponseWriter.Write([]byte("token无效"))
  49. return nil
  50. }
  51.  
  52. //如果有效,执行下一个处理器
  53. return ctx.Next(true)
  54. })
  55.  
  56. //在路由组中定义GET路由测试token验证
  57. router.GET("/", func(ctx *httpdispatcher.Context) error {
  58. log.Println("Token通过验证,执行了路由处理器")
  59. return nil
  60. })
  61.  
  62. svr := &http.Server{
  63. Addr: ":8080",
  64. Handler: dispatcher,
  65. }
  66. if err := svr.ListenAndServe(); err != nil {
  67. log.Fatal(err.Error())
  68. }
  69. }