auth.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package auth_jwt
  2. import (
  3. "fmt"
  4. "github.com/dgrijalva/jwt-go"
  5. "github.com/gogf/gf/errors/gerror"
  6. "time"
  7. )
  8. const (
  9. SecretKey = "ZHNmZ2Z5cnR5amttZ25iZGZzZ2V3dzQ1NDM2NHJkYXNnZGZnamdoajM0ZGZnaHJ0dTY="
  10. TokenDuration = 15 * time.Minute
  11. )
  12. // JWTManager is a JSON web token manager
  13. type JWTManager struct {
  14. secretKey string
  15. tokenDuration time.Duration
  16. }
  17. //UserClaims 自定义的JWT声明,包含一些用户信息
  18. type UserClaims struct {
  19. jwt.StandardClaims
  20. Username string `json:"username"`
  21. Roles []string `json:"roles"`
  22. }
  23. // NewJWTManager returns a new JWT manager
  24. func NewJWTManager(secretKey string, tokenDuration time.Duration) *JWTManager {
  25. if secretKey == "" {
  26. secretKey = SecretKey
  27. }
  28. return &JWTManager{secretKey, tokenDuration}
  29. }
  30. // Generate generates and signs a new token for a user
  31. func (manager *JWTManager) CreateToken(Id, userName string, Roles []string) (string, error) {
  32. token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
  33. "iss": "VioUser viodoc.com", // Issuer,该JWT的签发者
  34. "aud": "viodoc.com", //目标受众
  35. "nbf": time.Now().Unix(), //不早于
  36. "exp": time.Now().Add(time.Hour).Unix(), // Expiration Time,过期时间
  37. "sub": "VioUser viodoc.com", // Subject,主题
  38. "Id": Id,
  39. "username": userName,
  40. "Roles": Roles,
  41. })
  42. return token.SignedString([]byte(manager.secretKey))
  43. }
  44. // Verify 验证token字符串,如果token有效,则返回用户声明
  45. func (manager *JWTManager) Verify(accessToken string) (*UserClaims, error) {
  46. token, err := jwt.ParseWithClaims(
  47. accessToken, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
  48. if token.Header["alg"] != "HS256" {
  49. return nil, gerror.New("算法有误,只支持HS256算法")
  50. }
  51. return []byte(manager.secretKey), nil
  52. })
  53. if err != nil {
  54. return nil, fmt.Errorf(err.Error())
  55. }
  56. claims, ok := token.Claims.(*UserClaims)
  57. if !ok {
  58. return nil, fmt.Errorf("token定义无效")
  59. }
  60. return claims, nil
  61. }
  62. //从token中获取用户唯一标识
  63. func userClaimFromToken(tokenInfo UserClaims) string {
  64. return tokenInfo.Username
  65. }