main.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package main
  2. import (
  3. "fmt"
  4. // "bytes"
  5. // "encoding/json"
  6. // "io/ioutil"
  7. "log"
  8. "net/http"
  9. "strings"
  10. "time"
  11. jwt "github.com/dgrijalva/jwt-go"
  12. "github.com/go-macaron/binding"
  13. "gopkg.in/macaron.v1"
  14. )
  15. const (
  16. JWT_Secret = "jwt-Dashoo-1705"
  17. JWT_Issuer = "dashoo.cn"
  18. JWT_Audience = "dashoo"
  19. JWT_Expires = 24 * 60 * 60 // 24h
  20. )
  21. type MyCustomClaims struct {
  22. // This will hold a users username after authenticating.
  23. // Ignore `json:"username"` it's required by JSON
  24. Username string `json:"username"`
  25. // This will hold claims that are recommended having (Expiration, issuer)
  26. jwt.StandardClaims
  27. }
  28. func main() {
  29. m := macaron.Classic()
  30. m.Use(macaron.Recovery())
  31. m.Use(macaron.Renderer())
  32. m.Use(macaron.Static("front_end"))
  33. m.Get("/", defaultGet)
  34. //前端框架使用的API
  35. m.Post("/api/auth/login", binding.Json(User{}), loginPost)
  36. m.Post("/api/tokens", binding.Json(User{}), genTokenPost) // 生成JWT token
  37. m.Get("/api/tokens", checkTokenGet) // 检验JWT token是否有效
  38. m.Get("/api/users/me", getCurUserGet) // 获取登录用户信息
  39. log.Println("Server is running...")
  40. log.Println(http.ListenAndServe("0.0.0.0:4000", m))
  41. }
  42. // 返回的json body 映射结构
  43. type User struct {
  44. Username string `json:"username"`
  45. Password string `json:"password"`
  46. }
  47. type ResultUser struct {
  48. Name string `json:"name"`
  49. UserName string `json:"username"`
  50. Slug string `json:"slug"`
  51. }
  52. type ResponseUser struct {
  53. User ResultUser `json:"user"`
  54. }
  55. // 用户登录处理
  56. func loginPost(ctx *macaron.Context, user User) {
  57. // request data body 通过binding自动解析到映射结构
  58. username := user.Username
  59. // todo 处理登录验证
  60. // 返回json数据
  61. ctx.JSON(200, map[string]interface{}{
  62. "user": username,
  63. "role": "admin",
  64. })
  65. }
  66. // 生成JWT token
  67. func genTokenPost(ctx *macaron.Context, user User) {
  68. fmt.Println("un=", user.Username)
  69. claims := MyCustomClaims{
  70. user.Username,
  71. jwt.StandardClaims{
  72. NotBefore: int64(time.Now().Unix()),
  73. ExpiresAt: int64(time.Now().Unix() + JWT_Expires),
  74. Issuer: JWT_Issuer,
  75. },
  76. }
  77. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  78. signedToken, err := token.SignedString([]byte(JWT_Secret))
  79. if err != nil {
  80. log.Println(err)
  81. // return 401
  82. }
  83. ctx.JSON(201, map[string]interface{}{
  84. "token": signedToken,
  85. })
  86. }
  87. // 检验JWT token是否有效
  88. func checkTokenGet(ctx *macaron.Context) {
  89. // fmt.Println(ctx.Req.Request.Header["Authorization"])
  90. authString := ctx.Req.Request.Header["Authorization"][0]
  91. auths := strings.Split(authString, " ")
  92. if len(auths) != 2 || auths[0] != "Bearer" {
  93. log.Println("AuthString invalid:", authString)
  94. // return 401
  95. }
  96. signedToken := auths[1]
  97. fmt.Println("signedToken=", signedToken)
  98. token, err := jwt.ParseWithClaims(signedToken, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
  99. return []byte(JWT_Secret), nil
  100. })
  101. if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
  102. fmt.Printf("%v %v", claims.Username, claims.StandardClaims.ExpiresAt)
  103. ctx.JSON(200, map[string]interface{}{
  104. "msg": "Token is validated.",
  105. })
  106. } else {
  107. fmt.Println(err)
  108. // return 401
  109. }
  110. // ctx.JSON(200, map[string]interface{}{
  111. // "user": username,
  112. // "role": "admin",
  113. // })
  114. }
  115. func getCurUserGet(ctx *macaron.Context) ResponseUser {
  116. authString := ctx.Req.Request.Header["Authorization"][0]
  117. auths := strings.Split(authString, " ")
  118. if len(auths) != 2 || auths[0] != "Bearer" {
  119. log.Println("AuthString invalid:", authString)
  120. // return 401
  121. }
  122. signedToken := auths[1]
  123. fmt.Println("signedToken=", signedToken)
  124. token, err := jwt.ParseWithClaims(signedToken, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
  125. return []byte(JWT_Secret), nil
  126. })
  127. if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
  128. fmt.Printf("%v %v", claims.Username, claims.StandardClaims.ExpiresAt)
  129. //to do get user
  130. user := ResultUser{}
  131. user.Name = claims.Username
  132. user.UserName = claims.Username
  133. user.Slug = "dashoo"
  134. responseUser := ResponseUser{}
  135. responseUser.User = user
  136. return responseUser
  137. // ctx.JSON(200, map[string]interface{}{
  138. // "username": claims.Username,
  139. // })
  140. } else {
  141. fmt.Println(err)
  142. return ResponseUser{}
  143. // return 401
  144. }
  145. }
  146. func defaultGet(ctx *macaron.Context) {
  147. ctx.Data["method"] = "(Get)"
  148. ctx.HTML(200, "default")
  149. }