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  }