aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/golang-jwt/jwt/v5/token.go
diff options
context:
space:
mode:
authorLibravatar Rutger Broekhoff2023-12-30 14:00:34 +0100
committerLibravatar Rutger Broekhoff2023-12-30 14:00:34 +0100
commitf6c92c5e2d87ab1334648b0d1293771de7aae4a5 (patch)
tree265c3a06accd398a1e0a173af56d7392a5f94a24 /vendor/github.com/golang-jwt/jwt/v5/token.go
parent4f167c0fa991aa9ddb3f0252e23694b3aa6532b1 (diff)
downloadgitolfs3-f6c92c5e2d87ab1334648b0d1293771de7aae4a5.tar.gz
gitolfs3-f6c92c5e2d87ab1334648b0d1293771de7aae4a5.zip
Implement git-lfs-authenticate
Diffstat (limited to 'vendor/github.com/golang-jwt/jwt/v5/token.go')
-rw-r--r--vendor/github.com/golang-jwt/jwt/v5/token.go100
1 files changed, 100 insertions, 0 deletions
diff --git a/vendor/github.com/golang-jwt/jwt/v5/token.go b/vendor/github.com/golang-jwt/jwt/v5/token.go
new file mode 100644
index 0000000..352873a
--- /dev/null
+++ b/vendor/github.com/golang-jwt/jwt/v5/token.go
@@ -0,0 +1,100 @@
1package jwt
2
3import (
4 "crypto"
5 "encoding/base64"
6 "encoding/json"
7)
8
9// Keyfunc will be used by the Parse methods as a callback function to supply
10// the key for verification. The function receives the parsed, but unverified
11// Token. This allows you to use properties in the Header of the token (such as
12// `kid`) to identify which key to use.
13//
14// The returned interface{} may be a single key or a VerificationKeySet containing
15// multiple keys.
16type Keyfunc func(*Token) (interface{}, error)
17
18// VerificationKey represents a public or secret key for verifying a token's signature.
19type VerificationKey interface {
20 crypto.PublicKey | []uint8
21}
22
23// VerificationKeySet is a set of public or secret keys. It is used by the parser to verify a token.
24type VerificationKeySet struct {
25 Keys []VerificationKey
26}
27
28// Token represents a JWT Token. Different fields will be used depending on
29// whether you're creating or parsing/verifying a token.
30type Token struct {
31 Raw string // Raw contains the raw token. Populated when you [Parse] a token
32 Method SigningMethod // Method is the signing method used or to be used
33 Header map[string]interface{} // Header is the first segment of the token in decoded form
34 Claims Claims // Claims is the second segment of the token in decoded form
35 Signature []byte // Signature is the third segment of the token in decoded form. Populated when you Parse a token
36 Valid bool // Valid specifies if the token is valid. Populated when you Parse/Verify a token
37}
38
39// New creates a new [Token] with the specified signing method and an empty map
40// of claims. Additional options can be specified, but are currently unused.
41func New(method SigningMethod, opts ...TokenOption) *Token {
42 return NewWithClaims(method, MapClaims{}, opts...)
43}
44
45// NewWithClaims creates a new [Token] with the specified signing method and
46// claims. Additional options can be specified, but are currently unused.
47func NewWithClaims(method SigningMethod, claims Claims, opts ...TokenOption) *Token {
48 return &Token{
49 Header: map[string]interface{}{
50 "typ": "JWT",
51 "alg": method.Alg(),
52 },
53 Claims: claims,
54 Method: method,
55 }
56}
57
58// SignedString creates and returns a complete, signed JWT. The token is signed
59// using the SigningMethod specified in the token. Please refer to
60// https://golang-jwt.github.io/jwt/usage/signing_methods/#signing-methods-and-key-types
61// for an overview of the different signing methods and their respective key
62// types.
63func (t *Token) SignedString(key interface{}) (string, error) {
64 sstr, err := t.SigningString()
65 if err != nil {
66 return "", err
67 }
68
69 sig, err := t.Method.Sign(sstr, key)
70 if err != nil {
71 return "", err
72 }
73
74 return sstr + "." + t.EncodeSegment(sig), nil
75}
76
77// SigningString generates the signing string. This is the most expensive part
78// of the whole deal. Unless you need this for something special, just go
79// straight for the SignedString.
80func (t *Token) SigningString() (string, error) {
81 h, err := json.Marshal(t.Header)
82 if err != nil {
83 return "", err
84 }
85
86 c, err := json.Marshal(t.Claims)
87 if err != nil {
88 return "", err
89 }
90
91 return t.EncodeSegment(h) + "." + t.EncodeSegment(c), nil
92}
93
94// EncodeSegment encodes a JWT specific base64url encoding with padding
95// stripped. In the future, this function might take into account a
96// [TokenOption]. Therefore, this function exists as a method of [Token], rather
97// than a global function.
98func (*Token) EncodeSegment(seg []byte) string {
99 return base64.RawURLEncoding.EncodeToString(seg)
100}