jwt.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package tool
  2. import (
  3. "crypto/rand"
  4. "fmt"
  5. "github.com/dgrijalva/jwt-go"
  6. "gogs.io/gogs/internal/conf"
  7. "time"
  8. )
  9. type Subject int
  10. const (
  11. SubjectActiveAccount Subject = 1
  12. SubjectActiveEmail Subject = 2
  13. SubjectForgetPasswd Subject = 3
  14. )
  15. var secretKey = make([]byte, 32)
  16. func init() {
  17. if _, err := rand.Read(secretKey); err != nil {
  18. panic(err)
  19. }
  20. }
  21. type Claims struct {
  22. Audience string `json:"aud,omitempty"`
  23. ExpiresAt int64 `json:"exp,omitempty"`
  24. Id int64 `json:"jti,omitempty"`
  25. Email string `json:"email,omitempty"`
  26. IssuedAt int64 `json:"iat,omitempty"`
  27. Issuer string `json:"iss,omitempty"`
  28. NotBefore int64 `json:"nbf,omitempty"`
  29. Subject Subject `json:"sub,omitempty"`
  30. }
  31. func (c *Claims) Valid() error {
  32. now := time.Now()
  33. if now.After(time.Unix(c.ExpiresAt, 0)) {
  34. return fmt.Errorf("error")
  35. }
  36. if now.Before(time.Unix(c.NotBefore, 0)) {
  37. return fmt.Errorf("error")
  38. }
  39. if now.Before(time.Unix(c.IssuedAt, 0)) {
  40. return fmt.Errorf("error")
  41. }
  42. if c.Audience != c.Email {
  43. return fmt.Errorf("error")
  44. }
  45. return nil
  46. }
  47. func NewClaims(id int64, email string, subject Subject) *Claims {
  48. now := time.Now()
  49. return &Claims{
  50. Audience: email,
  51. ExpiresAt: now.Add(time.Duration(conf.Auth.ActivateCodeLives) * time.Minute).Unix(),
  52. Id: id,
  53. Email: email,
  54. IssuedAt: now.Unix(),
  55. Issuer: conf.Server.ExternalURL,
  56. NotBefore: now.Unix(),
  57. Subject: subject,
  58. }
  59. }
  60. func (c *Claims) ToToken() (string, error) {
  61. token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
  62. //使用指定的secret签名并获得完成的编码后的字符串token
  63. return token.SignedString(secretKey)
  64. }
  65. func ParseToken(t string) (*Claims, error) {
  66. //解析token
  67. token, err := jwt.ParseWithClaims(t, &Claims{}, func(token *jwt.Token) (i interface{}, err error) {
  68. return secretKey, nil
  69. })
  70. if err != nil {
  71. return nil, err
  72. }
  73. if claims, ok := token.Claims.(*Claims); ok && claims != nil && token.Valid {
  74. return claims, nil
  75. } else if err := claims.Valid(); err != nil {
  76. return nil, err
  77. }
  78. if claims, ok := token.Claims.(*Claims); ok && claims != nil && token.Valid {
  79. if err := claims.Valid(); err != nil {
  80. return nil, err
  81. }
  82. return claims, nil
  83. }
  84. return nil, fmt.Errorf("invalid token")
  85. }