1. // @APIVersion 1.0.0
    2. // @Title 认证中心、用户中心
    3. // @Description token、用户、角色、权限
    4. package routers
    5. import (
    6. "zhsq_go/code"
    7. "zhsq_go/user_center/controllers"
    8. "zhsq_go/user_center/models"
    9. "github.com/astaxie/beego"
    10. "github.com/astaxie/beego/context"
    11. )
    12. func init() {
    13. // 所有接口访问之前的过滤器
    14. beego.InsertFilter("/*", beego.BeforeRouter, func(ctx *context.Context) {
    15. // 校验Token是否有效
    16. result, userId := models.FilterValidateToken(ctx)
    17. if !result { //Token无效
    18. message := code.ApiResult{Code: code.UNAUTHORIZED, Message: "Token 无效!"}
    19. ctx.Output.JSON(message, false, false)
    20. return
    21. } else {
    22. ctx.Input.SetData("userId", userId)
    23. }
    24. })
    25. ns := beego.NewNamespace("/api/user-center",
    26. beego.NSNamespace("/token",
    27. beego.NSInclude(
    28. &controllers.TokenController{},
    29. ),
    30. ),
    31. )
    32. beego.AddNamespace(ns)
    33. }
    1. package models
    2. import (
    3. "fmt"
    4. "net/http"
    5. "strings"
    6. "github.com/astaxie/beego"
    7. "github.com/astaxie/beego/context"
    8. "github.com/dgrijalva/jwt-go"
    9. "github.com/dgrijalva/jwt-go/request"
    10. )
    11. const (
    12. // TokenSecretKey 令牌密钥
    13. TokenSecretKey = "TokenSecretKey"
    14. // TokenPeriod 令牌有效期,24个小时
    15. TokenPeriod = 24
    16. )
    17. // Token 令牌信息
    18. type Token struct {
    19. Token string `json:"token"` //令牌
    20. ExpiresIn int64 `json:"expiresIn"` //过期时间,秒级
    21. }
    22. // 过滤器校验Token有效性
    23. func FilterValidateToken(ctx *context.Context) (bool, string) {
    24. ignoredUrls := beego.AppConfig.Strings("ignored::url")
    25. url := ctx.Request.RequestURI
    26. // 判断用户请求地址是否在忽略列表中;默认不在列表中。
    27. isExist := false
    28. if url == "/" {
    29. isExist = true
    30. } else {
    31. for i := 0; i < len(ignoredUrls); i++ {
    32. isExist = strings.Contains(url, ignoredUrls[i])
    33. if isExist {
    34. break
    35. }
    36. }
    37. }
    38. if !isExist { //不在忽略列表中,需要校验Token是否有效
    39. return ValidateToken(ctx)
    40. } else {
    41. // 放行
    42. return true, ""
    43. }
    44. }
    45. // 校验Token有效性
    46. func ValidateToken(ctx *context.Context) (bool, string) {
    47. var r *http.Request = ctx.Request
    48. // 从请求头信息中获取Token
    49. token, err := request.ParseFromRequest(r, request.AuthorizationHeaderExtractor,
    50. func(token *jwt.Token) (interface{}, error) {
    51. return []byte(TokenSecretKey), nil
    52. })
    53. if err == nil {
    54. //TODO先到数据库中判断Token是否存在
    55. //如果Token在数据库中存在,判断Token是否有效
    56. // fmt.Println("Claims", fmt.Sprintf("%+v", token.Claims))
    57. if token.Valid {
    58. // token有效
    59. // fmt.Println("Token is valid")
    60. claims := token.Claims.(jwt.MapClaims)
    61. return true, fmt.Sprintf("%+v", claims["userId"])
    62. } else {
    63. // token无效
    64. // fmt.Println("Token is not valid")
    65. return false, ""
    66. }
    67. } else {
    68. // fmt.Println("Unauthorized access to this resource")
    69. return false, ""
    70. }
    71. }