You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

auth.go 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package packages
  4. import (
  5. "fmt"
  6. "net/http"
  7. "strings"
  8. "time"
  9. user_model "code.gitea.io/gitea/models/user"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/setting"
  12. "github.com/golang-jwt/jwt/v4"
  13. )
  14. type packageClaims struct {
  15. jwt.RegisteredClaims
  16. UserID int64
  17. }
  18. func CreateAuthorizationToken(u *user_model.User) (string, error) {
  19. now := time.Now()
  20. claims := packageClaims{
  21. RegisteredClaims: jwt.RegisteredClaims{
  22. ExpiresAt: jwt.NewNumericDate(now.Add(24 * time.Hour)),
  23. NotBefore: jwt.NewNumericDate(now),
  24. },
  25. UserID: u.ID,
  26. }
  27. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  28. tokenString, err := token.SignedString([]byte(setting.SecretKey))
  29. if err != nil {
  30. return "", err
  31. }
  32. return tokenString, nil
  33. }
  34. func ParseAuthorizationToken(req *http.Request) (int64, error) {
  35. h := req.Header.Get("Authorization")
  36. if h == "" {
  37. return 0, nil
  38. }
  39. parts := strings.SplitN(h, " ", 2)
  40. if len(parts) != 2 {
  41. log.Error("split token failed: %s", h)
  42. return 0, fmt.Errorf("split token failed")
  43. }
  44. token, err := jwt.ParseWithClaims(parts[1], &packageClaims{}, func(t *jwt.Token) (any, error) {
  45. if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
  46. return nil, fmt.Errorf("unexpected signing method: %v", t.Header["alg"])
  47. }
  48. return []byte(setting.SecretKey), nil
  49. })
  50. if err != nil {
  51. return 0, err
  52. }
  53. c, ok := token.Claims.(*packageClaims)
  54. if !token.Valid || !ok {
  55. return 0, fmt.Errorf("invalid token claim")
  56. }
  57. return c.UserID, nil
  58. }