gitea源码

auth.go 1.9KB

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