jwt.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package service
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/dgrijalva/jwt-go"
  6. setting "icloudapp.cn/tools/config"
  7. "icloudapp.cn/tools/repository/redis"
  8. "time"
  9. )
  10. // PosterClaims Claims,保存用户id和nickname
  11. type PosterClaims struct {
  12. Uid int64 `json:"uid"`
  13. Username string `json:"username"`
  14. jwt.StandardClaims
  15. }
  16. // GenToken 生成token
  17. func GenJWTToken(uid int64, username string) (string, error) {
  18. C := PosterClaims{
  19. uid,
  20. username,
  21. jwt.StandardClaims{
  22. ExpiresAt: time.Now().Add(JWTExpireDuration()).Unix(), //设置超时时间,输出过期的时间,按照格式
  23. Issuer: setting.Conf.JWTConfig.Project, //签发人
  24. },
  25. }
  26. //使用指定的签名方法创建签名对象
  27. token := jwt.NewWithClaims(jwt.SigningMethodHS256, C)
  28. //使用指定的secret签名并获得完整的编码后的字符串token
  29. signed, err := token.SignedString([]byte(setting.Conf.JWTConfig.Secret))
  30. if cacheErr := CacheJWTToken(uid, signed); cacheErr != nil {
  31. return "", errors.New("token缓存失败")
  32. }
  33. return signed, err
  34. }
  35. // ParseToken 验证token
  36. func ParseJWTToken(tokenString string) (*PosterClaims, error) {
  37. token, err := jwt.ParseWithClaims(tokenString, &PosterClaims{}, func(token *jwt.Token) (interface{}, error) {
  38. return []byte(setting.Conf.JWTConfig.Secret), nil
  39. })
  40. if err != nil {
  41. return nil, err
  42. }
  43. if claim, ok := token.Claims.(*PosterClaims); ok && token.Valid { //valid:正确,有效 校验token
  44. return claim, err //返回JWT中的字段
  45. }
  46. return nil, errors.New("Invalid token.")
  47. }
  48. // RemoveJWTToken 移除用户的token
  49. func RemoveJWTToken(uid int64) error {
  50. return redis.RedisClient.Del(JWTCacheKey(uid)).Err()
  51. }
  52. // GetJWTTokenFromRedis 获取redis中获取的jwt数据
  53. func GetJWTTokenFromRedis(uid int64) string {
  54. str, err := redis.RedisClient.Get(JWTCacheKey(uid)).Result()
  55. if err != nil {
  56. return ""
  57. }
  58. return str
  59. }
  60. // CacheJWTToken 缓存jwt token到redis
  61. func CacheJWTToken(uid int64, token string) error {
  62. return redis.RedisClient.Set(JWTCacheKey(uid), token, JWTExpireDuration()).Err()
  63. }
  64. // JWTCacheKey 获取jwt cache key
  65. func JWTCacheKey(uid int64) string {
  66. return fmt.Sprintf("%s_%s_%d", setting.Conf.JWTConfig.Prefix, "uid", uid)
  67. }
  68. // JWTExpireDuration jwt过期时间
  69. func JWTExpireDuration() time.Duration {
  70. duration := time.Duration(setting.Conf.JWTConfig.ExpireAt) * time.Second
  71. return duration
  72. }