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