token.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package server
  2. import (
  3. "crypto/md5"
  4. "encoding/base64"
  5. "encoding/hex"
  6. "encoding/json"
  7. "fmt"
  8. "strings"
  9. "time"
  10. "github.com/pborman/uuid"
  11. "gopkg.in/redis.v2"
  12. "xiaoniaokuaiyan.com/xiaoniao/config"
  13. "xiaoniaokuaiyan.com/xiaoniao/util"
  14. )
  15. type AuthToken struct {
  16. AccessToken string `json:"access_token"`
  17. TokenType string `json:"token_type,omitempty"`
  18. Expiry util.Time `json:"expiry,omitempty"`
  19. ClientId string `json:"clientid"`
  20. Iss string `json:"iss"`
  21. }
  22. // expired reports whether the token is expired.
  23. // t must be non-nil.
  24. func (t *AuthToken) expired() bool {
  25. if t.Expiry.IsZero() {
  26. return false
  27. }
  28. return t.Expiry.Add(-10 * time.Second).Before(time.Now())
  29. }
  30. // Valid reports whether t is non-nil, has an accessToken, and is not expired.
  31. func (t *AuthToken) IsValid() bool {
  32. return t != nil && t.AccessToken != "" && !t.expired()
  33. }
  34. /*func (t *AuthToken) MarshalJSON() ([]byte, error) {
  35. return json.Marshal(struct {
  36. accessToken string `json:"access_token"`
  37. TokenType string `json:"token_type"`
  38. Expiry int64 `json:"expiry"`
  39. Iss string `json:"iss"`
  40. }{
  41. accessToken: t.accessToken,
  42. TokenType: t.TokenType,
  43. Expiry: t.Expiry.Unix(),
  44. Iss: t.Iss,
  45. })
  46. }
  47. func (t *AuthToken) UnmarshalJSON(buf []byte) err{
  48. }*/
  49. type SessionToken struct {
  50. Token string `json:"token"`
  51. Data interface{} `json:"data"`
  52. }
  53. /*func (st *SessionToken) IsValid() bool {
  54. if isExp := st.Expiry.Add(-10 * time.Second).Before(time.Now()); isExp {
  55. return false
  56. }
  57. return st.Token != ""
  58. }*/
  59. //刷新登录会话token过期时间
  60. func TouchSessionToken(tokenStr string) (*SessionToken, error) {
  61. var client *redis.Client = util.GetRedis()
  62. client.Select(REDIS_API_AUTH_DB)
  63. /*strCmd := client.HGet(REDIS_API_SESSION_KEY, tokenStr)
  64. if err := strCmd.Err(); err != nil {
  65. return nil, err
  66. }
  67. sessionToken := &SessionToken{}
  68. err := json.Unmarshal([]byte(strCmd.Val()), sessionToken)
  69. if err != nil {
  70. return nil, err
  71. }
  72. sessionToken.Expiry = util.Time{time.Now().Add(time.Hour * 24)}
  73. sb, _ := json.Marshal(sessionToken)
  74. bcmd := client.HSet(REDIS_API_SESSION_KEY, tokenStr, string(sb))
  75. if err := bcmd.Err(); err != nil {
  76. return nil, err
  77. }*/
  78. var exp int64
  79. exp, _ = config.IniConf.Section("server").Key("redis_api_session_expire").Int64()
  80. if exp < 30 {
  81. exp = 60
  82. }
  83. bcmd := client.Expire(tokenStr, time.Minute*time.Duration(exp))
  84. if err := bcmd.Err(); err != nil {
  85. return nil, err
  86. }
  87. return nil, nil
  88. }
  89. func GenerateSessionToken(userid string) *SessionToken {
  90. token := uuid.NewRandom()
  91. tokenStr := strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(token)), "=")
  92. return &SessionToken{
  93. Token: tokenStr,
  94. Data: userid,
  95. }
  96. }
  97. func GenerateSessionId(userid string, source string) string {
  98. sessStr := fmt.Sprintf("%v-%v", userid, source)
  99. dst := md5.Sum([]byte(sessStr))
  100. return hex.EncodeToString(dst[0:])
  101. }
  102. func GetLoginSession(token string) (*SessionToken, error) {
  103. var client *redis.Client = util.GetRedis()
  104. client.Select(REDIS_API_AUTH_DB)
  105. strCmd := client.Get(token)
  106. if err := strCmd.Err(); err != nil {
  107. return nil, err
  108. }
  109. sessionToken := &SessionToken{}
  110. err := json.Unmarshal([]byte(strCmd.Val()), sessionToken)
  111. if err != nil {
  112. return nil, err
  113. }
  114. return sessionToken, nil
  115. }