mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-11-26 11:51:02 +00:00
github.com/golang-jwt/jwt v3.2.2 -> v4.1.0 (#397)
This commit is contained in:
parent
6547ef380c
commit
3837e03866
31 changed files with 568 additions and 271 deletions
2
go.mod
2
go.mod
|
@ -24,7 +24,7 @@ require (
|
||||||
github.com/go-playground/validator/v10 v10.9.0 // indirect
|
github.com/go-playground/validator/v10 v10.9.0 // indirect
|
||||||
github.com/go-sql-driver/mysql v1.6.0
|
github.com/go-sql-driver/mysql v1.6.0
|
||||||
github.com/gogits/go-gogs-client v0.0.0-20160212212711-d584b1e0fb4d
|
github.com/gogits/go-gogs-client v0.0.0-20160212212711-d584b1e0fb4d
|
||||||
github.com/golang-jwt/jwt v3.2.2+incompatible
|
github.com/golang-jwt/jwt/v4 v4.1.0
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
github.com/google/go-github/v39 v39.1.0
|
github.com/google/go-github/v39 v39.1.0
|
||||||
github.com/gorilla/securecookie v1.1.1
|
github.com/gorilla/securecookie v1.1.1
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -334,8 +334,8 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
|
||||||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
|
github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0=
|
||||||
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
|
github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
|
|
@ -18,7 +18,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/golang-jwt/jwt"
|
"github.com/golang-jwt/jwt/v4"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
22
vendor/github.com/golang-jwt/jwt/MIGRATION_GUIDE.md
generated
vendored
22
vendor/github.com/golang-jwt/jwt/MIGRATION_GUIDE.md
generated
vendored
|
@ -1,22 +0,0 @@
|
||||||
## Migration Guide (v3.2.1)
|
|
||||||
|
|
||||||
Starting from [v3.2.1](https://github.com/golang-jwt/jwt/releases/tag/v3.2.1]), the import path has changed from `github.com/dgrijalva/jwt-go` to `github.com/golang-jwt/jwt`. Future releases will be using the `github.com/golang-jwt/jwt` import path and continue the existing versioning scheme of `v3.x.x+incompatible`. Backwards-compatible patches and fixes will be done on the `v3` release branch, where as new build-breaking features will be developed in a `v4` release, possibly including a SIV-style import path.
|
|
||||||
|
|
||||||
### go.mod replacement
|
|
||||||
|
|
||||||
In a first step, the easiest way is to use `go mod edit` to issue a replacement.
|
|
||||||
|
|
||||||
```
|
|
||||||
go mod edit -replace github.com/dgrijalva/jwt-go=github.com/golang-jwt/jwt@v3.2.1+incompatible
|
|
||||||
go mod tidy
|
|
||||||
```
|
|
||||||
|
|
||||||
This will still keep the old import path in your code but replace it with the new package and also introduce a new indirect dependency to `github.com/golang-jwt/jwt`. Try to compile your project; it should still work.
|
|
||||||
|
|
||||||
### Cleanup
|
|
||||||
|
|
||||||
If your code still consistently builds, you can replace all occurences of `github.com/dgrijalva/jwt-go` with `github.com/golang-jwt/jwt`, either manually or by using tools such as `sed`. Finally, the `replace` directive in the `go.mod` file can be removed.
|
|
||||||
|
|
||||||
## Older releases (before v3.2.0)
|
|
||||||
|
|
||||||
The original migration guide for older releases can be found at https://github.com/dgrijalva/jwt-go/blob/master/MIGRATION_GUIDE.md.
|
|
146
vendor/github.com/golang-jwt/jwt/claims.go
generated
vendored
146
vendor/github.com/golang-jwt/jwt/claims.go
generated
vendored
|
@ -1,146 +0,0 @@
|
||||||
package jwt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/subtle"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// For a type to be a Claims object, it must just have a Valid method that determines
|
|
||||||
// if the token is invalid for any supported reason
|
|
||||||
type Claims interface {
|
|
||||||
Valid() error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Structured version of Claims Section, as referenced at
|
|
||||||
// https://tools.ietf.org/html/rfc7519#section-4.1
|
|
||||||
// See examples for how to use this with your own claim types
|
|
||||||
type StandardClaims struct {
|
|
||||||
Audience string `json:"aud,omitempty"`
|
|
||||||
ExpiresAt int64 `json:"exp,omitempty"`
|
|
||||||
Id string `json:"jti,omitempty"`
|
|
||||||
IssuedAt int64 `json:"iat,omitempty"`
|
|
||||||
Issuer string `json:"iss,omitempty"`
|
|
||||||
NotBefore int64 `json:"nbf,omitempty"`
|
|
||||||
Subject string `json:"sub,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validates time based claims "exp, iat, nbf".
|
|
||||||
// There is no accounting for clock skew.
|
|
||||||
// As well, if any of the above claims are not in the token, it will still
|
|
||||||
// be considered a valid claim.
|
|
||||||
func (c StandardClaims) Valid() error {
|
|
||||||
vErr := new(ValidationError)
|
|
||||||
now := TimeFunc().Unix()
|
|
||||||
|
|
||||||
// The claims below are optional, by default, so if they are set to the
|
|
||||||
// default value in Go, let's not fail the verification for them.
|
|
||||||
if !c.VerifyExpiresAt(now, false) {
|
|
||||||
delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0))
|
|
||||||
vErr.Inner = fmt.Errorf("token is expired by %v", delta)
|
|
||||||
vErr.Errors |= ValidationErrorExpired
|
|
||||||
}
|
|
||||||
|
|
||||||
if !c.VerifyIssuedAt(now, false) {
|
|
||||||
vErr.Inner = fmt.Errorf("Token used before issued")
|
|
||||||
vErr.Errors |= ValidationErrorIssuedAt
|
|
||||||
}
|
|
||||||
|
|
||||||
if !c.VerifyNotBefore(now, false) {
|
|
||||||
vErr.Inner = fmt.Errorf("token is not valid yet")
|
|
||||||
vErr.Errors |= ValidationErrorNotValidYet
|
|
||||||
}
|
|
||||||
|
|
||||||
if vErr.valid() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return vErr
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compares the aud claim against cmp.
|
|
||||||
// If required is false, this method will return true if the value matches or is unset
|
|
||||||
func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool {
|
|
||||||
return verifyAud([]string{c.Audience}, cmp, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compares the exp claim against cmp.
|
|
||||||
// If required is false, this method will return true if the value matches or is unset
|
|
||||||
func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool {
|
|
||||||
return verifyExp(c.ExpiresAt, cmp, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compares the iat claim against cmp.
|
|
||||||
// If required is false, this method will return true if the value matches or is unset
|
|
||||||
func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool {
|
|
||||||
return verifyIat(c.IssuedAt, cmp, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compares the iss claim against cmp.
|
|
||||||
// If required is false, this method will return true if the value matches or is unset
|
|
||||||
func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool {
|
|
||||||
return verifyIss(c.Issuer, cmp, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compares the nbf claim against cmp.
|
|
||||||
// If required is false, this method will return true if the value matches or is unset
|
|
||||||
func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool {
|
|
||||||
return verifyNbf(c.NotBefore, cmp, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----- helpers
|
|
||||||
|
|
||||||
func verifyAud(aud []string, cmp string, required bool) bool {
|
|
||||||
if len(aud) == 0 {
|
|
||||||
return !required
|
|
||||||
}
|
|
||||||
// use a var here to keep constant time compare when looping over a number of claims
|
|
||||||
result := false
|
|
||||||
|
|
||||||
var stringClaims string
|
|
||||||
for _, a := range aud {
|
|
||||||
if subtle.ConstantTimeCompare([]byte(a), []byte(cmp)) != 0 {
|
|
||||||
result = true
|
|
||||||
}
|
|
||||||
stringClaims = stringClaims + a
|
|
||||||
}
|
|
||||||
|
|
||||||
// case where "" is sent in one or many aud claims
|
|
||||||
if len(stringClaims) == 0 {
|
|
||||||
return !required
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
func verifyExp(exp int64, now int64, required bool) bool {
|
|
||||||
if exp == 0 {
|
|
||||||
return !required
|
|
||||||
}
|
|
||||||
return now <= exp
|
|
||||||
}
|
|
||||||
|
|
||||||
func verifyIat(iat int64, now int64, required bool) bool {
|
|
||||||
if iat == 0 {
|
|
||||||
return !required
|
|
||||||
}
|
|
||||||
return now >= iat
|
|
||||||
}
|
|
||||||
|
|
||||||
func verifyIss(iss string, cmp string, required bool) bool {
|
|
||||||
if iss == "" {
|
|
||||||
return !required
|
|
||||||
}
|
|
||||||
if subtle.ConstantTimeCompare([]byte(iss), []byte(cmp)) != 0 {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func verifyNbf(nbf int64, now int64, required bool) bool {
|
|
||||||
if nbf == 0 {
|
|
||||||
return !required
|
|
||||||
}
|
|
||||||
return now >= nbf
|
|
||||||
}
|
|
22
vendor/github.com/golang-jwt/jwt/v4/MIGRATION_GUIDE.md
generated
vendored
Normal file
22
vendor/github.com/golang-jwt/jwt/v4/MIGRATION_GUIDE.md
generated
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
## Migration Guide (v4.0.0)
|
||||||
|
|
||||||
|
Starting from [v4.0.0](https://github.com/golang-jwt/jwt/releases/tag/v4.0.0), the import path will be:
|
||||||
|
|
||||||
|
"github.com/golang-jwt/jwt/v4"
|
||||||
|
|
||||||
|
The `/v4` version will be backwards compatible with existing `v3.x.y` tags in this repo, as well as
|
||||||
|
`github.com/dgrijalva/jwt-go`. For most users this should be a drop-in replacement, if you're having
|
||||||
|
troubles migrating, please open an issue.
|
||||||
|
|
||||||
|
You can replace all occurrences of `github.com/dgrijalva/jwt-go` or `github.com/golang-jwt/jwt` with `github.com/golang-jwt/jwt/v4`, either manually or by using tools such as `sed` or `gofmt`.
|
||||||
|
|
||||||
|
And then you'd typically run:
|
||||||
|
|
||||||
|
```
|
||||||
|
go get github.com/golang-jwt/jwt/v4
|
||||||
|
go mod tidy
|
||||||
|
```
|
||||||
|
|
||||||
|
## Older releases (before v3.2.0)
|
||||||
|
|
||||||
|
The original migration guide for older releases can be found at https://github.com/dgrijalva/jwt-go/blob/master/MIGRATION_GUIDE.md.
|
|
@ -1,13 +1,15 @@
|
||||||
# jwt-go
|
# jwt-go
|
||||||
|
|
||||||
[![build](https://github.com/golang-jwt/jwt/actions/workflows/build.yml/badge.svg)](https://github.com/golang-jwt/jwt/actions/workflows/build.yml)
|
[![build](https://github.com/golang-jwt/jwt/actions/workflows/build.yml/badge.svg)](https://github.com/golang-jwt/jwt/actions/workflows/build.yml)
|
||||||
[![Go Reference](https://pkg.go.dev/badge/github.com/golang-jwt/jwt.svg)](https://pkg.go.dev/github.com/golang-jwt/jwt)
|
[![Go Reference](https://pkg.go.dev/badge/github.com/golang-jwt/jwt/v4.svg)](https://pkg.go.dev/github.com/golang-jwt/jwt/v4)
|
||||||
|
|
||||||
A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](https://datatracker.ietf.org/doc/html/rfc7519).
|
A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](https://datatracker.ietf.org/doc/html/rfc7519).
|
||||||
|
|
||||||
**IMPORT PATH CHANGE:** Starting from [v3.2.1](https://github.com/golang-jwt/jwt/releases/tag/v3.2.1), the import path has changed from `github.com/dgrijalva/jwt-go` to `github.com/golang-jwt/jwt`. After the original author of the library suggested migrating the maintenance of `jwt-go`, a dedicated team of open source maintainers decided to clone the existing library into this repository. See [dgrijalva/jwt-go#462](https://github.com/dgrijalva/jwt-go/issues/462) for a detailed discussion on this topic.
|
Starting with [v4.0.0](https://github.com/golang-jwt/jwt/releases/tag/v4.0.0) this project adds Go module support, but maintains backwards compatibility with older `v3.x.y` tags and upstream `github.com/dgrijalva/jwt-go`.
|
||||||
|
See the [`MIGRATION_GUIDE.md`](./MIGRATION_GUIDE.md) for more information.
|
||||||
|
|
||||||
|
> After the original author of the library suggested migrating the maintenance of `jwt-go`, a dedicated team of open source maintainers decided to clone the existing library into this repository. See [dgrijalva/jwt-go#462](https://github.com/dgrijalva/jwt-go/issues/462) for a detailed discussion on this topic.
|
||||||
|
|
||||||
Future releases will be using the `github.com/golang-jwt/jwt` import path and continue the existing versioning scheme of `v3.x.x+incompatible`. Backwards-compatible patches and fixes will be done on the `v3` release branch, where as new build-breaking features will be developed in a `v4` release, possibly including a SIV-style import path.
|
|
||||||
|
|
||||||
**SECURITY NOTICE:** Some older versions of Go have a security issue in the crypto/elliptic. Recommendation is to upgrade to at least 1.15 See issue [dgrijalva/jwt-go#216](https://github.com/dgrijalva/jwt-go/issues/216) for more detail.
|
**SECURITY NOTICE:** Some older versions of Go have a security issue in the crypto/elliptic. Recommendation is to upgrade to at least 1.15 See issue [dgrijalva/jwt-go#216](https://github.com/dgrijalva/jwt-go/issues/216) for more detail.
|
||||||
|
|
||||||
|
@ -50,7 +52,7 @@ Here's an example of an extension that integrates with multiple Google Cloud Pla
|
||||||
|
|
||||||
## Compliance
|
## Compliance
|
||||||
|
|
||||||
This library was last reviewed to comply with [RTF 7519](https://datatracker.ietf.org/doc/html/rfc7519) dated May 2015 with a few notable differences:
|
This library was last reviewed to comply with [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519) dated May 2015 with a few notable differences:
|
||||||
|
|
||||||
* In order to protect against accidental use of [Unsecured JWTs](https://datatracker.ietf.org/doc/html/rfc7519#section-6), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key.
|
* In order to protect against accidental use of [Unsecured JWTs](https://datatracker.ietf.org/doc/html/rfc7519#section-6), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key.
|
||||||
|
|
||||||
|
@ -60,10 +62,8 @@ This library is considered production ready. Feedback and feature requests are
|
||||||
|
|
||||||
This project uses [Semantic Versioning 2.0.0](http://semver.org). Accepted pull requests will land on `main`. Periodically, versions will be tagged from `main`. You can find all the releases on [the project releases page](https://github.com/golang-jwt/jwt/releases).
|
This project uses [Semantic Versioning 2.0.0](http://semver.org). Accepted pull requests will land on `main`. Periodically, versions will be tagged from `main`. You can find all the releases on [the project releases page](https://github.com/golang-jwt/jwt/releases).
|
||||||
|
|
||||||
While we try to make it obvious when we make breaking changes, there isn't a great mechanism for pushing announcements out to users. You may want to use this alternative package include: `gopkg.in/golang-jwt/jwt.v3`. It will do the right thing WRT semantic versioning.
|
|
||||||
|
|
||||||
**BREAKING CHANGES:***
|
**BREAKING CHANGES:***
|
||||||
* Version 3.0.0 includes _a lot_ of changes from the 2.x line, including a few that break the API. We've tried to break as few things as possible, so there should just be a few type signature changes. A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code.
|
A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code.
|
||||||
|
|
||||||
## Usage Tips
|
## Usage Tips
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ Each signing method expects a different object type for its signing keys. See th
|
||||||
* The [HMAC signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodHMAC) (`HS256`,`HS384`,`HS512`) expect `[]byte` values for signing and validation
|
* The [HMAC signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodHMAC) (`HS256`,`HS384`,`HS512`) expect `[]byte` values for signing and validation
|
||||||
* The [RSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodRSA) (`RS256`,`RS384`,`RS512`) expect `*rsa.PrivateKey` for signing and `*rsa.PublicKey` for validation
|
* The [RSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodRSA) (`RS256`,`RS384`,`RS512`) expect `*rsa.PrivateKey` for signing and `*rsa.PublicKey` for validation
|
||||||
* The [ECDSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodECDSA) (`ES256`,`ES384`,`ES512`) expect `*ecdsa.PrivateKey` for signing and `*ecdsa.PublicKey` for validation
|
* The [ECDSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodECDSA) (`ES256`,`ES384`,`ES512`) expect `*ecdsa.PrivateKey` for signing and `*ecdsa.PublicKey` for validation
|
||||||
|
* The [EdDSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodEd25519) (`Ed25519`) expect `ed25519.PrivateKey` for signing and `ed25519.PublicKey` for validation
|
||||||
|
|
||||||
### JWT and OAuth
|
### JWT and OAuth
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
## `jwt-go` Version History
|
## `jwt-go` Version History
|
||||||
|
|
||||||
|
#### 4.0.0
|
||||||
|
|
||||||
|
* Introduces support for Go modules. The `v4` version will be backwards compatible with `v3.x.y`.
|
||||||
|
|
||||||
#### 3.2.2
|
#### 3.2.2
|
||||||
|
|
||||||
* Starting from this release, we are adopting the policy to support the most 2 recent versions of Go currently available. By the time of this release, this is Go 1.15 and 1.16 ([#28](https://github.com/golang-jwt/jwt/pull/28)).
|
* Starting from this release, we are adopting the policy to support the most 2 recent versions of Go currently available. By the time of this release, this is Go 1.15 and 1.16 ([#28](https://github.com/golang-jwt/jwt/pull/28)).
|
267
vendor/github.com/golang-jwt/jwt/v4/claims.go
generated
vendored
Normal file
267
vendor/github.com/golang-jwt/jwt/v4/claims.go
generated
vendored
Normal file
|
@ -0,0 +1,267 @@
|
||||||
|
package jwt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/subtle"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Claims must just have a Valid method that determines
|
||||||
|
// if the token is invalid for any supported reason
|
||||||
|
type Claims interface {
|
||||||
|
Valid() error
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisteredClaims are a structured version of the JWT Claims Set,
|
||||||
|
// restricted to Registered Claim Names, as referenced at
|
||||||
|
// https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
|
||||||
|
//
|
||||||
|
// This type can be used on its own, but then additional private and
|
||||||
|
// public claims embedded in the JWT will not be parsed. The typical usecase
|
||||||
|
// therefore is to embedded this in a user-defined claim type.
|
||||||
|
//
|
||||||
|
// See examples for how to use this with your own claim types.
|
||||||
|
type RegisteredClaims struct {
|
||||||
|
// the `iss` (Issuer) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.1
|
||||||
|
Issuer string `json:"iss,omitempty"`
|
||||||
|
|
||||||
|
// the `sub` (Subject) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.2
|
||||||
|
Subject string `json:"sub,omitempty"`
|
||||||
|
|
||||||
|
// the `aud` (Audience) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.3
|
||||||
|
Audience ClaimStrings `json:"aud,omitempty"`
|
||||||
|
|
||||||
|
// the `exp` (Expiration Time) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.4
|
||||||
|
ExpiresAt *NumericDate `json:"exp,omitempty"`
|
||||||
|
|
||||||
|
// the `nbf` (Not Before) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.5
|
||||||
|
NotBefore *NumericDate `json:"nbf,omitempty"`
|
||||||
|
|
||||||
|
// the `iat` (Issued At) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.6
|
||||||
|
IssuedAt *NumericDate `json:"iat,omitempty"`
|
||||||
|
|
||||||
|
// the `jti` (JWT ID) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.7
|
||||||
|
ID string `json:"jti,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid validates time based claims "exp, iat, nbf".
|
||||||
|
// There is no accounting for clock skew.
|
||||||
|
// As well, if any of the above claims are not in the token, it will still
|
||||||
|
// be considered a valid claim.
|
||||||
|
func (c RegisteredClaims) Valid() error {
|
||||||
|
vErr := new(ValidationError)
|
||||||
|
now := TimeFunc()
|
||||||
|
|
||||||
|
// The claims below are optional, by default, so if they are set to the
|
||||||
|
// default value in Go, let's not fail the verification for them.
|
||||||
|
if !c.VerifyExpiresAt(now, false) {
|
||||||
|
delta := now.Sub(c.ExpiresAt.Time)
|
||||||
|
vErr.Inner = fmt.Errorf("token is expired by %v", delta)
|
||||||
|
vErr.Errors |= ValidationErrorExpired
|
||||||
|
}
|
||||||
|
|
||||||
|
if !c.VerifyIssuedAt(now, false) {
|
||||||
|
vErr.Inner = fmt.Errorf("token used before issued")
|
||||||
|
vErr.Errors |= ValidationErrorIssuedAt
|
||||||
|
}
|
||||||
|
|
||||||
|
if !c.VerifyNotBefore(now, false) {
|
||||||
|
vErr.Inner = fmt.Errorf("token is not valid yet")
|
||||||
|
vErr.Errors |= ValidationErrorNotValidYet
|
||||||
|
}
|
||||||
|
|
||||||
|
if vErr.valid() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return vErr
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyAudience compares the aud claim against cmp.
|
||||||
|
// If required is false, this method will return true if the value matches or is unset
|
||||||
|
func (c *RegisteredClaims) VerifyAudience(cmp string, req bool) bool {
|
||||||
|
return verifyAud(c.Audience, cmp, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyExpiresAt compares the exp claim against cmp (cmp <= exp).
|
||||||
|
// If req is false, it will return true, if exp is unset.
|
||||||
|
func (c *RegisteredClaims) VerifyExpiresAt(cmp time.Time, req bool) bool {
|
||||||
|
if c.ExpiresAt == nil {
|
||||||
|
return verifyExp(nil, cmp, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
return verifyExp(&c.ExpiresAt.Time, cmp, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyIssuedAt compares the iat claim against cmp (cmp >= iat).
|
||||||
|
// If req is false, it will return true, if iat is unset.
|
||||||
|
func (c *RegisteredClaims) VerifyIssuedAt(cmp time.Time, req bool) bool {
|
||||||
|
if c.IssuedAt == nil {
|
||||||
|
return verifyIat(nil, cmp, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
return verifyIat(&c.IssuedAt.Time, cmp, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyNotBefore compares the nbf claim against cmp (cmp >= nbf).
|
||||||
|
// If req is false, it will return true, if nbf is unset.
|
||||||
|
func (c *RegisteredClaims) VerifyNotBefore(cmp time.Time, req bool) bool {
|
||||||
|
if c.NotBefore == nil {
|
||||||
|
return verifyNbf(nil, cmp, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
return verifyNbf(&c.NotBefore.Time, cmp, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StandardClaims are a structured version of the JWT Claims Set, as referenced at
|
||||||
|
// https://datatracker.ietf.org/doc/html/rfc7519#section-4. They do not follow the
|
||||||
|
// specification exactly, since they were based on an earlier draft of the
|
||||||
|
// specification and not updated. The main difference is that they only
|
||||||
|
// support integer-based date fields and singular audiences. This might lead to
|
||||||
|
// incompatibilities with other JWT implementations. The use of this is discouraged, instead
|
||||||
|
// the newer RegisteredClaims struct should be used.
|
||||||
|
//
|
||||||
|
// Deprecated: Use RegisteredClaims instead for a forward-compatible way to access registered claims in a struct.
|
||||||
|
type StandardClaims struct {
|
||||||
|
Audience string `json:"aud,omitempty"`
|
||||||
|
ExpiresAt int64 `json:"exp,omitempty"`
|
||||||
|
Id string `json:"jti,omitempty"`
|
||||||
|
IssuedAt int64 `json:"iat,omitempty"`
|
||||||
|
Issuer string `json:"iss,omitempty"`
|
||||||
|
NotBefore int64 `json:"nbf,omitempty"`
|
||||||
|
Subject string `json:"sub,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid validates time based claims "exp, iat, nbf". There is no accounting for clock skew.
|
||||||
|
// As well, if any of the above claims are not in the token, it will still
|
||||||
|
// be considered a valid claim.
|
||||||
|
func (c StandardClaims) Valid() error {
|
||||||
|
vErr := new(ValidationError)
|
||||||
|
now := TimeFunc().Unix()
|
||||||
|
|
||||||
|
// The claims below are optional, by default, so if they are set to the
|
||||||
|
// default value in Go, let's not fail the verification for them.
|
||||||
|
if !c.VerifyExpiresAt(now, false) {
|
||||||
|
delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0))
|
||||||
|
vErr.Inner = fmt.Errorf("token is expired by %v", delta)
|
||||||
|
vErr.Errors |= ValidationErrorExpired
|
||||||
|
}
|
||||||
|
|
||||||
|
if !c.VerifyIssuedAt(now, false) {
|
||||||
|
vErr.Inner = fmt.Errorf("token used before issued")
|
||||||
|
vErr.Errors |= ValidationErrorIssuedAt
|
||||||
|
}
|
||||||
|
|
||||||
|
if !c.VerifyNotBefore(now, false) {
|
||||||
|
vErr.Inner = fmt.Errorf("token is not valid yet")
|
||||||
|
vErr.Errors |= ValidationErrorNotValidYet
|
||||||
|
}
|
||||||
|
|
||||||
|
if vErr.valid() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return vErr
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyAudience compares the aud claim against cmp.
|
||||||
|
// If required is false, this method will return true if the value matches or is unset
|
||||||
|
func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool {
|
||||||
|
return verifyAud([]string{c.Audience}, cmp, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyExpiresAt compares the exp claim against cmp (cmp <= exp).
|
||||||
|
// If req is false, it will return true, if exp is unset.
|
||||||
|
func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool {
|
||||||
|
if c.ExpiresAt == 0 {
|
||||||
|
return verifyExp(nil, time.Unix(cmp, 0), req)
|
||||||
|
}
|
||||||
|
|
||||||
|
t := time.Unix(c.ExpiresAt, 0)
|
||||||
|
return verifyExp(&t, time.Unix(cmp, 0), req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyIssuedAt compares the iat claim against cmp (cmp >= iat).
|
||||||
|
// If req is false, it will return true, if iat is unset.
|
||||||
|
func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool {
|
||||||
|
if c.IssuedAt == 0 {
|
||||||
|
return verifyIat(nil, time.Unix(cmp, 0), req)
|
||||||
|
}
|
||||||
|
|
||||||
|
t := time.Unix(c.IssuedAt, 0)
|
||||||
|
return verifyIat(&t, time.Unix(cmp, 0), req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyNotBefore compares the nbf claim against cmp (cmp >= nbf).
|
||||||
|
// If req is false, it will return true, if nbf is unset.
|
||||||
|
func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool {
|
||||||
|
if c.NotBefore == 0 {
|
||||||
|
return verifyNbf(nil, time.Unix(cmp, 0), req)
|
||||||
|
}
|
||||||
|
|
||||||
|
t := time.Unix(c.NotBefore, 0)
|
||||||
|
return verifyNbf(&t, time.Unix(cmp, 0), req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyIssuer compares the iss claim against cmp.
|
||||||
|
// If required is false, this method will return true if the value matches or is unset
|
||||||
|
func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool {
|
||||||
|
return verifyIss(c.Issuer, cmp, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----- helpers
|
||||||
|
|
||||||
|
func verifyAud(aud []string, cmp string, required bool) bool {
|
||||||
|
if len(aud) == 0 {
|
||||||
|
return !required
|
||||||
|
}
|
||||||
|
// use a var here to keep constant time compare when looping over a number of claims
|
||||||
|
result := false
|
||||||
|
|
||||||
|
var stringClaims string
|
||||||
|
for _, a := range aud {
|
||||||
|
if subtle.ConstantTimeCompare([]byte(a), []byte(cmp)) != 0 {
|
||||||
|
result = true
|
||||||
|
}
|
||||||
|
stringClaims = stringClaims + a
|
||||||
|
}
|
||||||
|
|
||||||
|
// case where "" is sent in one or many aud claims
|
||||||
|
if len(stringClaims) == 0 {
|
||||||
|
return !required
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifyExp(exp *time.Time, now time.Time, required bool) bool {
|
||||||
|
if exp == nil {
|
||||||
|
return !required
|
||||||
|
}
|
||||||
|
return now.Before(*exp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifyIat(iat *time.Time, now time.Time, required bool) bool {
|
||||||
|
if iat == nil {
|
||||||
|
return !required
|
||||||
|
}
|
||||||
|
return now.After(*iat) || now.Equal(*iat)
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifyNbf(nbf *time.Time, now time.Time, required bool) bool {
|
||||||
|
if nbf == nil {
|
||||||
|
return !required
|
||||||
|
}
|
||||||
|
return now.After(*nbf) || now.Equal(*nbf)
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifyIss(iss string, cmp string, required bool) bool {
|
||||||
|
if iss == "" {
|
||||||
|
return !required
|
||||||
|
}
|
||||||
|
if subtle.ConstantTimeCompare([]byte(iss), []byte(cmp)) != 0 {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
0
vendor/github.com/golang-jwt/jwt/doc.go → vendor/github.com/golang-jwt/jwt/v4/doc.go
generated
vendored
0
vendor/github.com/golang-jwt/jwt/doc.go → vendor/github.com/golang-jwt/jwt/v4/doc.go
generated
vendored
|
@ -13,7 +13,7 @@ var (
|
||||||
ErrECDSAVerification = errors.New("crypto/ecdsa: verification error")
|
ErrECDSAVerification = errors.New("crypto/ecdsa: verification error")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Implements the ECDSA family of signing methods signing methods
|
// SigningMethodECDSA implements the ECDSA family of signing methods.
|
||||||
// Expects *ecdsa.PrivateKey for signing and *ecdsa.PublicKey for verification
|
// Expects *ecdsa.PrivateKey for signing and *ecdsa.PublicKey for verification
|
||||||
type SigningMethodECDSA struct {
|
type SigningMethodECDSA struct {
|
||||||
Name string
|
Name string
|
||||||
|
@ -53,7 +53,7 @@ func (m *SigningMethodECDSA) Alg() string {
|
||||||
return m.Name
|
return m.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements the Verify method from SigningMethod
|
// Verify implements token verification for the SigningMethod.
|
||||||
// For this verify method, key must be an ecdsa.PublicKey struct
|
// For this verify method, key must be an ecdsa.PublicKey struct
|
||||||
func (m *SigningMethodECDSA) Verify(signingString, signature string, key interface{}) error {
|
func (m *SigningMethodECDSA) Verify(signingString, signature string, key interface{}) error {
|
||||||
var err error
|
var err error
|
||||||
|
@ -95,7 +95,7 @@ func (m *SigningMethodECDSA) Verify(signingString, signature string, key interfa
|
||||||
return ErrECDSAVerification
|
return ErrECDSAVerification
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements the Sign method from SigningMethod
|
// Sign implements token signing for the SigningMethod.
|
||||||
// For this signing method, key must be an ecdsa.PrivateKey struct
|
// For this signing method, key must be an ecdsa.PrivateKey struct
|
||||||
func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) {
|
func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) {
|
||||||
// Get the key
|
// Get the key
|
|
@ -8,11 +8,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrNotECPublicKey = errors.New("Key is not a valid ECDSA public key")
|
ErrNotECPublicKey = errors.New("key is not a valid ECDSA public key")
|
||||||
ErrNotECPrivateKey = errors.New("Key is not a valid ECDSA private key")
|
ErrNotECPrivateKey = errors.New("key is not a valid ECDSA private key")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Parse PEM encoded Elliptic Curve Private Key Structure
|
// ParseECPrivateKeyFromPEM parses a PEM encoded Elliptic Curve Private Key Structure
|
||||||
func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) {
|
func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) {
|
||||||
return pkey, nil
|
return pkey, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse PEM encoded PKCS1 or PKCS8 public key
|
// ParseECPublicKeyFromPEM parses a PEM encoded PKCS1 or PKCS8 public key
|
||||||
func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) {
|
func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
|
@ -3,14 +3,16 @@ package jwt
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"crypto"
|
||||||
"crypto/ed25519"
|
"crypto/ed25519"
|
||||||
|
"crypto/rand"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrEd25519Verification = errors.New("ed25519: verification error")
|
ErrEd25519Verification = errors.New("ed25519: verification error")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Implements the EdDSA family
|
// SigningMethodEd25519 implements the EdDSA family.
|
||||||
// Expects ed25519.PrivateKey for signing and ed25519.PublicKey for verification
|
// Expects ed25519.PrivateKey for signing and ed25519.PublicKey for verification
|
||||||
type SigningMethodEd25519 struct{}
|
type SigningMethodEd25519 struct{}
|
||||||
|
|
||||||
|
@ -30,7 +32,7 @@ func (m *SigningMethodEd25519) Alg() string {
|
||||||
return "EdDSA"
|
return "EdDSA"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements the Verify method from SigningMethod
|
// Verify implements token verification for the SigningMethod.
|
||||||
// For this verify method, key must be an ed25519.PublicKey
|
// For this verify method, key must be an ed25519.PublicKey
|
||||||
func (m *SigningMethodEd25519) Verify(signingString, signature string, key interface{}) error {
|
func (m *SigningMethodEd25519) Verify(signingString, signature string, key interface{}) error {
|
||||||
var err error
|
var err error
|
||||||
|
@ -59,23 +61,25 @@ func (m *SigningMethodEd25519) Verify(signingString, signature string, key inter
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements the Sign method from SigningMethod
|
// Sign implements token signing for the SigningMethod.
|
||||||
// For this signing method, key must be an ed25519.PrivateKey
|
// For this signing method, key must be an ed25519.PrivateKey
|
||||||
func (m *SigningMethodEd25519) Sign(signingString string, key interface{}) (string, error) {
|
func (m *SigningMethodEd25519) Sign(signingString string, key interface{}) (string, error) {
|
||||||
var ed25519Key ed25519.PrivateKey
|
var ed25519Key crypto.Signer
|
||||||
var ok bool
|
var ok bool
|
||||||
|
|
||||||
if ed25519Key, ok = key.(ed25519.PrivateKey); !ok {
|
if ed25519Key, ok = key.(crypto.Signer); !ok {
|
||||||
return "", ErrInvalidKeyType
|
return "", ErrInvalidKeyType
|
||||||
}
|
}
|
||||||
|
|
||||||
// ed25519.Sign panics if private key not equal to ed25519.PrivateKeySize
|
if _, ok := ed25519Key.Public().(ed25519.PublicKey); !ok {
|
||||||
// this allows to avoid recover usage
|
|
||||||
if len(ed25519Key) != ed25519.PrivateKeySize {
|
|
||||||
return "", ErrInvalidKey
|
return "", ErrInvalidKey
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sign the string and return the encoded result
|
// Sign the string and return the encoded result
|
||||||
sig := ed25519.Sign(ed25519Key, []byte(signingString))
|
// ed25519 performs a two-pass hash as part of its algorithm. Therefore, we need to pass a non-prehashed message into the Sign function, as indicated by crypto.Hash(0)
|
||||||
|
sig, err := ed25519Key.Sign(rand.Reader, []byte(signingString), crypto.Hash(0))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
return EncodeSegment(sig), nil
|
return EncodeSegment(sig), nil
|
||||||
}
|
}
|
|
@ -9,11 +9,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrNotEdPrivateKey = errors.New("Key is not a valid Ed25519 private key")
|
ErrNotEdPrivateKey = errors.New("key is not a valid Ed25519 private key")
|
||||||
ErrNotEdPublicKey = errors.New("Key is not a valid Ed25519 public key")
|
ErrNotEdPublicKey = errors.New("key is not a valid Ed25519 public key")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Parse PEM-encoded Edwards curve private key
|
// ParseEdPrivateKeyFromPEM parses a PEM-encoded Edwards curve private key
|
||||||
func ParseEdPrivateKeyFromPEM(key []byte) (crypto.PrivateKey, error) {
|
func ParseEdPrivateKeyFromPEM(key []byte) (crypto.PrivateKey, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ func ParseEdPrivateKeyFromPEM(key []byte) (crypto.PrivateKey, error) {
|
||||||
return pkey, nil
|
return pkey, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse PEM-encoded Edwards curve public key
|
// ParseEdPublicKeyFromPEM parses a PEM-encoded Edwards curve public key
|
||||||
func ParseEdPublicKeyFromPEM(key []byte) (crypto.PublicKey, error) {
|
func ParseEdPublicKeyFromPEM(key []byte) (crypto.PublicKey, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
|
@ -27,7 +27,7 @@ const (
|
||||||
ValidationErrorClaimsInvalid // Generic claims validation error
|
ValidationErrorClaimsInvalid // Generic claims validation error
|
||||||
)
|
)
|
||||||
|
|
||||||
// Helper for constructing a ValidationError with a string error message
|
// NewValidationError is a helper for constructing a ValidationError with a string error message
|
||||||
func NewValidationError(errorText string, errorFlags uint32) *ValidationError {
|
func NewValidationError(errorText string, errorFlags uint32) *ValidationError {
|
||||||
return &ValidationError{
|
return &ValidationError{
|
||||||
text: errorText,
|
text: errorText,
|
||||||
|
@ -35,14 +35,14 @@ func NewValidationError(errorText string, errorFlags uint32) *ValidationError {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The error from Parse if token is not valid
|
// ValidationError represents an error from Parse if token is not valid
|
||||||
type ValidationError struct {
|
type ValidationError struct {
|
||||||
Inner error // stores the error returned by external dependencies, i.e.: KeyFunc
|
Inner error // stores the error returned by external dependencies, i.e.: KeyFunc
|
||||||
Errors uint32 // bitfield. see ValidationError... constants
|
Errors uint32 // bitfield. see ValidationError... constants
|
||||||
text string // errors that do not have a valid error just have text
|
text string // errors that do not have a valid error just have text
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validation error is an error type
|
// Error is the implementation of the err interface.
|
||||||
func (e ValidationError) Error() string {
|
func (e ValidationError) Error() string {
|
||||||
if e.Inner != nil {
|
if e.Inner != nil {
|
||||||
return e.Inner.Error()
|
return e.Inner.Error()
|
3
vendor/github.com/golang-jwt/jwt/v4/go.mod
generated
vendored
Normal file
3
vendor/github.com/golang-jwt/jwt/v4/go.mod
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module github.com/golang-jwt/jwt/v4
|
||||||
|
|
||||||
|
go 1.15
|
0
vendor/github.com/golang-jwt/jwt/v4/go.sum
generated
vendored
Normal file
0
vendor/github.com/golang-jwt/jwt/v4/go.sum
generated
vendored
Normal file
|
@ -6,7 +6,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Implements the HMAC-SHA family of signing methods signing methods
|
// SigningMethodHMAC implements the HMAC-SHA family of signing methods.
|
||||||
// Expects key type of []byte for both signing and validation
|
// Expects key type of []byte for both signing and validation
|
||||||
type SigningMethodHMAC struct {
|
type SigningMethodHMAC struct {
|
||||||
Name string
|
Name string
|
||||||
|
@ -45,7 +45,7 @@ func (m *SigningMethodHMAC) Alg() string {
|
||||||
return m.Name
|
return m.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify the signature of HSXXX tokens. Returns nil if the signature is valid.
|
// Verify implements token verification for the SigningMethod. Returns nil if the signature is valid.
|
||||||
func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error {
|
func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error {
|
||||||
// Verify the key is the right type
|
// Verify the key is the right type
|
||||||
keyBytes, ok := key.([]byte)
|
keyBytes, ok := key.([]byte)
|
||||||
|
@ -77,7 +77,7 @@ func (m *SigningMethodHMAC) Verify(signingString, signature string, key interfac
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements the Sign method from SigningMethod for this signing method.
|
// Sign implements token signing for the SigningMethod.
|
||||||
// Key must be []byte
|
// Key must be []byte
|
||||||
func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) {
|
func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) {
|
||||||
if keyBytes, ok := key.([]byte); ok {
|
if keyBytes, ok := key.([]byte); ok {
|
|
@ -3,10 +3,11 @@ package jwt
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"time"
|
||||||
// "fmt"
|
// "fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Claims type that uses the map[string]interface{} for JSON decoding
|
// MapClaims is a claims type that uses the map[string]interface{} for JSON decoding.
|
||||||
// This is the default claims type if you don't supply one
|
// This is the default claims type if you don't supply one
|
||||||
type MapClaims map[string]interface{}
|
type MapClaims map[string]interface{}
|
||||||
|
|
||||||
|
@ -31,65 +32,92 @@ func (m MapClaims) VerifyAudience(cmp string, req bool) bool {
|
||||||
return verifyAud(aud, cmp, req)
|
return verifyAud(aud, cmp, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compares the exp claim against cmp.
|
// VerifyExpiresAt compares the exp claim against cmp (cmp <= exp).
|
||||||
// If required is false, this method will return true if the value matches or is unset
|
// If req is false, it will return true, if exp is unset.
|
||||||
func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool {
|
func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool {
|
||||||
exp, ok := m["exp"]
|
cmpTime := time.Unix(cmp, 0)
|
||||||
|
|
||||||
|
v, ok := m["exp"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return !req
|
return !req
|
||||||
}
|
}
|
||||||
switch expType := exp.(type) {
|
|
||||||
|
switch exp := v.(type) {
|
||||||
case float64:
|
case float64:
|
||||||
return verifyExp(int64(expType), cmp, req)
|
if exp == 0 {
|
||||||
case json.Number:
|
return verifyExp(nil, cmpTime, req)
|
||||||
v, _ := expType.Int64()
|
|
||||||
return verifyExp(v, cmp, req)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return verifyExp(&newNumericDateFromSeconds(exp).Time, cmpTime, req)
|
||||||
|
case json.Number:
|
||||||
|
v, _ := exp.Float64()
|
||||||
|
|
||||||
|
return verifyExp(&newNumericDateFromSeconds(v).Time, cmpTime, req)
|
||||||
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compares the iat claim against cmp.
|
// VerifyIssuedAt compares the exp claim against cmp (cmp >= iat).
|
||||||
// If required is false, this method will return true if the value matches or is unset
|
// If req is false, it will return true, if iat is unset.
|
||||||
func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool {
|
func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool {
|
||||||
iat, ok := m["iat"]
|
cmpTime := time.Unix(cmp, 0)
|
||||||
|
|
||||||
|
v, ok := m["iat"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return !req
|
return !req
|
||||||
}
|
}
|
||||||
switch iatType := iat.(type) {
|
|
||||||
|
switch iat := v.(type) {
|
||||||
case float64:
|
case float64:
|
||||||
return verifyIat(int64(iatType), cmp, req)
|
if iat == 0 {
|
||||||
case json.Number:
|
return verifyIat(nil, cmpTime, req)
|
||||||
v, _ := iatType.Int64()
|
|
||||||
return verifyIat(v, cmp, req)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return verifyIat(&newNumericDateFromSeconds(iat).Time, cmpTime, req)
|
||||||
|
case json.Number:
|
||||||
|
v, _ := iat.Float64()
|
||||||
|
|
||||||
|
return verifyIat(&newNumericDateFromSeconds(v).Time, cmpTime, req)
|
||||||
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compares the iss claim against cmp.
|
// VerifyNotBefore compares the nbf claim against cmp (cmp >= nbf).
|
||||||
|
// If req is false, it will return true, if nbf is unset.
|
||||||
|
func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool {
|
||||||
|
cmpTime := time.Unix(cmp, 0)
|
||||||
|
|
||||||
|
v, ok := m["nbf"]
|
||||||
|
if !ok {
|
||||||
|
return !req
|
||||||
|
}
|
||||||
|
|
||||||
|
switch nbf := v.(type) {
|
||||||
|
case float64:
|
||||||
|
if nbf == 0 {
|
||||||
|
return verifyNbf(nil, cmpTime, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
return verifyNbf(&newNumericDateFromSeconds(nbf).Time, cmpTime, req)
|
||||||
|
case json.Number:
|
||||||
|
v, _ := nbf.Float64()
|
||||||
|
|
||||||
|
return verifyNbf(&newNumericDateFromSeconds(v).Time, cmpTime, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyIssuer compares the iss claim against cmp.
|
||||||
// If required is false, this method will return true if the value matches or is unset
|
// If required is false, this method will return true if the value matches or is unset
|
||||||
func (m MapClaims) VerifyIssuer(cmp string, req bool) bool {
|
func (m MapClaims) VerifyIssuer(cmp string, req bool) bool {
|
||||||
iss, _ := m["iss"].(string)
|
iss, _ := m["iss"].(string)
|
||||||
return verifyIss(iss, cmp, req)
|
return verifyIss(iss, cmp, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compares the nbf claim against cmp.
|
// Valid validates time based claims "exp, iat, nbf".
|
||||||
// If required is false, this method will return true if the value matches or is unset
|
|
||||||
func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool {
|
|
||||||
nbf, ok := m["nbf"]
|
|
||||||
if !ok {
|
|
||||||
return !req
|
|
||||||
}
|
|
||||||
switch nbfType := nbf.(type) {
|
|
||||||
case float64:
|
|
||||||
return verifyNbf(int64(nbfType), cmp, req)
|
|
||||||
case json.Number:
|
|
||||||
v, _ := nbfType.Int64()
|
|
||||||
return verifyNbf(v, cmp, req)
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validates time based claims "exp, iat, nbf".
|
|
||||||
// There is no accounting for clock skew.
|
// There is no accounting for clock skew.
|
||||||
// As well, if any of the above claims are not in the token, it will still
|
// As well, if any of the above claims are not in the token, it will still
|
||||||
// be considered a valid claim.
|
// be considered a valid claim.
|
|
@ -1,6 +1,6 @@
|
||||||
package jwt
|
package jwt
|
||||||
|
|
||||||
// Implements the none signing method. This is required by the spec
|
// SigningMethodNone implements the none signing method. This is required by the spec
|
||||||
// but you probably should never use it.
|
// but you probably should never use it.
|
||||||
var SigningMethodNone *signingMethodNone
|
var SigningMethodNone *signingMethodNone
|
||||||
|
|
|
@ -13,7 +13,7 @@ type Parser struct {
|
||||||
SkipClaimsValidation bool // Skip claims validation during token parsing
|
SkipClaimsValidation bool // Skip claims validation during token parsing
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse, validate, and return a token.
|
// Parse parses, validates, and returns a token.
|
||||||
// keyFunc will receive the parsed token and should return the key for validating.
|
// keyFunc will receive the parsed token and should return the key for validating.
|
||||||
// If everything is kosher, err will be nil
|
// If everything is kosher, err will be nil
|
||||||
func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) {
|
func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) {
|
||||||
|
@ -87,12 +87,12 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf
|
||||||
return token, vErr
|
return token, vErr
|
||||||
}
|
}
|
||||||
|
|
||||||
// WARNING: Don't use this method unless you know what you're doing
|
// ParseUnverified parses the token but doesn't validate the signature.
|
||||||
//
|
//
|
||||||
// This method parses the token but doesn't validate the signature. It's only
|
// WARNING: Don't use this method unless you know what you're doing.
|
||||||
// ever useful in cases where you know the signature is valid (because it has
|
//
|
||||||
// been checked previously in the stack) and you want to extract values from
|
// It's only ever useful in cases where you know the signature is valid (because it has
|
||||||
// it.
|
// been checked previously in the stack) and you want to extract values from it.
|
||||||
func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) {
|
func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) {
|
||||||
parts = strings.Split(tokenString, ".")
|
parts = strings.Split(tokenString, ".")
|
||||||
if len(parts) != 3 {
|
if len(parts) != 3 {
|
6
vendor/github.com/golang-jwt/jwt/rsa.go → vendor/github.com/golang-jwt/jwt/v4/rsa.go
generated
vendored
6
vendor/github.com/golang-jwt/jwt/rsa.go → vendor/github.com/golang-jwt/jwt/v4/rsa.go
generated
vendored
|
@ -6,7 +6,7 @@ import (
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Implements the RSA family of signing methods signing methods
|
// SigningMethodRSA implements the RSA family of signing methods.
|
||||||
// Expects *rsa.PrivateKey for signing and *rsa.PublicKey for validation
|
// Expects *rsa.PrivateKey for signing and *rsa.PublicKey for validation
|
||||||
type SigningMethodRSA struct {
|
type SigningMethodRSA struct {
|
||||||
Name string
|
Name string
|
||||||
|
@ -44,7 +44,7 @@ func (m *SigningMethodRSA) Alg() string {
|
||||||
return m.Name
|
return m.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements the Verify method from SigningMethod
|
// Verify implements token verification for the SigningMethod
|
||||||
// For this signing method, must be an *rsa.PublicKey structure.
|
// For this signing method, must be an *rsa.PublicKey structure.
|
||||||
func (m *SigningMethodRSA) Verify(signingString, signature string, key interface{}) error {
|
func (m *SigningMethodRSA) Verify(signingString, signature string, key interface{}) error {
|
||||||
var err error
|
var err error
|
||||||
|
@ -73,7 +73,7 @@ func (m *SigningMethodRSA) Verify(signingString, signature string, key interface
|
||||||
return rsa.VerifyPKCS1v15(rsaKey, m.Hash, hasher.Sum(nil), sig)
|
return rsa.VerifyPKCS1v15(rsaKey, m.Hash, hasher.Sum(nil), sig)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements the Sign method from SigningMethod
|
// Sign implements token signing for the SigningMethod
|
||||||
// For this signing method, must be an *rsa.PrivateKey structure.
|
// For this signing method, must be an *rsa.PrivateKey structure.
|
||||||
func (m *SigningMethodRSA) Sign(signingString string, key interface{}) (string, error) {
|
func (m *SigningMethodRSA) Sign(signingString string, key interface{}) (string, error) {
|
||||||
var rsaKey *rsa.PrivateKey
|
var rsaKey *rsa.PrivateKey
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Implements the RSAPSS family of signing methods signing methods
|
// SigningMethodRSAPSS implements the RSAPSS family of signing methods signing methods
|
||||||
type SigningMethodRSAPSS struct {
|
type SigningMethodRSAPSS struct {
|
||||||
*SigningMethodRSA
|
*SigningMethodRSA
|
||||||
Options *rsa.PSSOptions
|
Options *rsa.PSSOptions
|
||||||
|
@ -79,7 +79,7 @@ func init() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements the Verify method from SigningMethod
|
// Verify implements token verification for the SigningMethod.
|
||||||
// For this verify method, key must be an rsa.PublicKey struct
|
// For this verify method, key must be an rsa.PublicKey struct
|
||||||
func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error {
|
func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error {
|
||||||
var err error
|
var err error
|
||||||
|
@ -113,7 +113,7 @@ func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interf
|
||||||
return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, opts)
|
return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements the Sign method from SigningMethod
|
// Sign implements token signing for the SigningMethod.
|
||||||
// For this signing method, key must be an rsa.PrivateKey struct
|
// For this signing method, key must be an rsa.PrivateKey struct
|
||||||
func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) {
|
func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) {
|
||||||
var rsaKey *rsa.PrivateKey
|
var rsaKey *rsa.PrivateKey
|
|
@ -8,12 +8,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be a PEM encoded PKCS1 or PKCS8 key")
|
ErrKeyMustBePEMEncoded = errors.New("invalid key: Key must be a PEM encoded PKCS1 or PKCS8 key")
|
||||||
ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key")
|
ErrNotRSAPrivateKey = errors.New("key is not a valid RSA private key")
|
||||||
ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key")
|
ErrNotRSAPublicKey = errors.New("key is not a valid RSA public key")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Parse PEM encoded PKCS1 or PKCS8 private key
|
// ParseRSAPrivateKeyFromPEM parses a PEM encoded PKCS1 or PKCS8 private key
|
||||||
func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) {
|
func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
@ -39,7 +39,11 @@ func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) {
|
||||||
return pkey, nil
|
return pkey, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse PEM encoded PKCS1 or PKCS8 private key protected with password
|
// ParseRSAPrivateKeyFromPEMWithPassword parses a PEM encoded PKCS1 or PKCS8 private key protected with password
|
||||||
|
//
|
||||||
|
// Deprecated: This function is deprecated and should not be used anymore. It uses the deprecated x509.DecryptPEMBlock
|
||||||
|
// function, which was deprecated since RFC 1423 is regarded insecure by design. Unfortunately, there is no alternative
|
||||||
|
// in the Go standard library for now. See https://github.com/golang/go/issues/8860.
|
||||||
func ParseRSAPrivateKeyFromPEMWithPassword(key []byte, password string) (*rsa.PrivateKey, error) {
|
func ParseRSAPrivateKeyFromPEMWithPassword(key []byte, password string) (*rsa.PrivateKey, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
@ -71,7 +75,7 @@ func ParseRSAPrivateKeyFromPEMWithPassword(key []byte, password string) (*rsa.Pr
|
||||||
return pkey, nil
|
return pkey, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse PEM encoded PKCS1 or PKCS8 public key
|
// ParseRSAPublicKeyFromPEM parses a PEM encoded PKCS1 or PKCS8 public key
|
||||||
func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) {
|
func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
|
@ -7,14 +7,14 @@ import (
|
||||||
var signingMethods = map[string]func() SigningMethod{}
|
var signingMethods = map[string]func() SigningMethod{}
|
||||||
var signingMethodLock = new(sync.RWMutex)
|
var signingMethodLock = new(sync.RWMutex)
|
||||||
|
|
||||||
// Implement SigningMethod to add new methods for signing or verifying tokens.
|
// SigningMethod can be used add new methods for signing or verifying tokens.
|
||||||
type SigningMethod interface {
|
type SigningMethod interface {
|
||||||
Verify(signingString, signature string, key interface{}) error // Returns nil if signature is valid
|
Verify(signingString, signature string, key interface{}) error // Returns nil if signature is valid
|
||||||
Sign(signingString string, key interface{}) (string, error) // Returns encoded signature or error
|
Sign(signingString string, key interface{}) (string, error) // Returns encoded signature or error
|
||||||
Alg() string // returns the alg identifier for this method (example: 'HS256')
|
Alg() string // returns the alg identifier for this method (example: 'HS256')
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register the "alg" name and a factory function for signing method.
|
// RegisterSigningMethod registers the "alg" name and a factory function for signing method.
|
||||||
// This is typically done during init() in the method's implementation
|
// This is typically done during init() in the method's implementation
|
||||||
func RegisterSigningMethod(alg string, f func() SigningMethod) {
|
func RegisterSigningMethod(alg string, f func() SigningMethod) {
|
||||||
signingMethodLock.Lock()
|
signingMethodLock.Lock()
|
||||||
|
@ -23,7 +23,7 @@ func RegisterSigningMethod(alg string, f func() SigningMethod) {
|
||||||
signingMethods[alg] = f
|
signingMethods[alg] = f
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get a signing method from an "alg" string
|
// GetSigningMethod retrieves a signing method from an "alg" string
|
||||||
func GetSigningMethod(alg string) (method SigningMethod) {
|
func GetSigningMethod(alg string) (method SigningMethod) {
|
||||||
signingMethodLock.RLock()
|
signingMethodLock.RLock()
|
||||||
defer signingMethodLock.RUnlock()
|
defer signingMethodLock.RUnlock()
|
1
vendor/github.com/golang-jwt/jwt/v4/staticcheck.conf
generated
vendored
Normal file
1
vendor/github.com/golang-jwt/jwt/v4/staticcheck.conf
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
checks = ["all", "-ST1000", "-ST1003", "-ST1016", "-ST1023"]
|
22
vendor/github.com/golang-jwt/jwt/token.go → vendor/github.com/golang-jwt/jwt/v4/token.go
generated
vendored
22
vendor/github.com/golang-jwt/jwt/token.go → vendor/github.com/golang-jwt/jwt/v4/token.go
generated
vendored
|
@ -12,13 +12,13 @@ import (
|
||||||
// server uses a different time zone than your tokens.
|
// server uses a different time zone than your tokens.
|
||||||
var TimeFunc = time.Now
|
var TimeFunc = time.Now
|
||||||
|
|
||||||
// Parse methods use this callback function to supply
|
// Keyfunc will be used by the Parse methods as a callback function to supply
|
||||||
// the key for verification. The function receives the parsed,
|
// the key for verification. The function receives the parsed,
|
||||||
// but unverified Token. This allows you to use properties in the
|
// but unverified Token. This allows you to use properties in the
|
||||||
// Header of the token (such as `kid`) to identify which key to use.
|
// Header of the token (such as `kid`) to identify which key to use.
|
||||||
type Keyfunc func(*Token) (interface{}, error)
|
type Keyfunc func(*Token) (interface{}, error)
|
||||||
|
|
||||||
// A JWT Token. Different fields will be used depending on whether you're
|
// Token represents a JWT Token. Different fields will be used depending on whether you're
|
||||||
// creating or parsing/verifying a token.
|
// creating or parsing/verifying a token.
|
||||||
type Token struct {
|
type Token struct {
|
||||||
Raw string // The raw token. Populated when you Parse a token
|
Raw string // The raw token. Populated when you Parse a token
|
||||||
|
@ -29,7 +29,7 @@ type Token struct {
|
||||||
Valid bool // Is the token valid? Populated when you Parse/Verify a token
|
Valid bool // Is the token valid? Populated when you Parse/Verify a token
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new Token. Takes a signing method
|
// New creates a new Token. Takes a signing method
|
||||||
func New(method SigningMethod) *Token {
|
func New(method SigningMethod) *Token {
|
||||||
return NewWithClaims(method, MapClaims{})
|
return NewWithClaims(method, MapClaims{})
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ func NewWithClaims(method SigningMethod, claims Claims) *Token {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the complete, signed token
|
// SignedString retrieves the complete, signed token
|
||||||
func (t *Token) SignedString(key interface{}) (string, error) {
|
func (t *Token) SignedString(key interface{}) (string, error) {
|
||||||
var sig, sstr string
|
var sig, sstr string
|
||||||
var err error
|
var err error
|
||||||
|
@ -58,7 +58,7 @@ func (t *Token) SignedString(key interface{}) (string, error) {
|
||||||
return strings.Join([]string{sstr, sig}, "."), nil
|
return strings.Join([]string{sstr, sig}, "."), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate the signing string. This is the
|
// SigningString generates the signing string. This is the
|
||||||
// most expensive part of the whole deal. Unless you
|
// most expensive part of the whole deal. Unless you
|
||||||
// need this for something special, just go straight for
|
// need this for something special, just go straight for
|
||||||
// the SignedString.
|
// the SignedString.
|
||||||
|
@ -82,7 +82,7 @@ func (t *Token) SigningString() (string, error) {
|
||||||
return strings.Join(parts, "."), nil
|
return strings.Join(parts, "."), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse, validate, and return a token.
|
// Parse parses, validates, and returns a token.
|
||||||
// keyFunc will receive the parsed token and should return the key for validating.
|
// keyFunc will receive the parsed token and should return the key for validating.
|
||||||
// If everything is kosher, err will be nil
|
// If everything is kosher, err will be nil
|
||||||
func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) {
|
func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) {
|
||||||
|
@ -93,12 +93,18 @@ func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token
|
||||||
return new(Parser).ParseWithClaims(tokenString, claims, keyFunc)
|
return new(Parser).ParseWithClaims(tokenString, claims, keyFunc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode JWT specific base64url encoding with padding stripped
|
// EncodeSegment encodes a JWT specific base64url encoding with padding stripped
|
||||||
|
//
|
||||||
|
// Deprecated: In a future release, we will demote this function to a non-exported function, since it
|
||||||
|
// should only be used internally
|
||||||
func EncodeSegment(seg []byte) string {
|
func EncodeSegment(seg []byte) string {
|
||||||
return base64.RawURLEncoding.EncodeToString(seg)
|
return base64.RawURLEncoding.EncodeToString(seg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode JWT specific base64url encoding with padding stripped
|
// DecodeSegment decodes a JWT specific base64url encoding with padding stripped
|
||||||
|
//
|
||||||
|
// Deprecated: In a future release, we will demote this function to a non-exported function, since it
|
||||||
|
// should only be used internally
|
||||||
func DecodeSegment(seg string) ([]byte, error) {
|
func DecodeSegment(seg string) ([]byte, error) {
|
||||||
return base64.RawURLEncoding.DecodeString(seg)
|
return base64.RawURLEncoding.DecodeString(seg)
|
||||||
}
|
}
|
125
vendor/github.com/golang-jwt/jwt/v4/types.go
generated
vendored
Normal file
125
vendor/github.com/golang-jwt/jwt/v4/types.go
generated
vendored
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
package jwt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TimePrecision sets the precision of times and dates within this library.
|
||||||
|
// This has an influence on the precision of times when comparing expiry or
|
||||||
|
// other related time fields. Furthermore, it is also the precision of times
|
||||||
|
// when serializing.
|
||||||
|
//
|
||||||
|
// For backwards compatibility the default precision is set to seconds, so that
|
||||||
|
// no fractional timestamps are generated.
|
||||||
|
var TimePrecision = time.Second
|
||||||
|
|
||||||
|
// MarshalSingleStringAsArray modifies the behaviour of the ClaimStrings type, especially
|
||||||
|
// its MarshalJSON function.
|
||||||
|
//
|
||||||
|
// If it is set to true (the default), it will always serialize the type as an
|
||||||
|
// array of strings, even if it just contains one element, defaulting to the behaviour
|
||||||
|
// of the underlying []string. If it is set to false, it will serialize to a single
|
||||||
|
// string, if it contains one element. Otherwise, it will serialize to an array of strings.
|
||||||
|
var MarshalSingleStringAsArray = true
|
||||||
|
|
||||||
|
// NumericDate represents a JSON numeric date value, as referenced at
|
||||||
|
// https://datatracker.ietf.org/doc/html/rfc7519#section-2.
|
||||||
|
type NumericDate struct {
|
||||||
|
time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNumericDate constructs a new *NumericDate from a standard library time.Time struct.
|
||||||
|
// It will truncate the timestamp according to the precision specified in TimePrecision.
|
||||||
|
func NewNumericDate(t time.Time) *NumericDate {
|
||||||
|
return &NumericDate{t.Truncate(TimePrecision)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// newNumericDateFromSeconds creates a new *NumericDate out of a float64 representing a
|
||||||
|
// UNIX epoch with the float fraction representing non-integer seconds.
|
||||||
|
func newNumericDateFromSeconds(f float64) *NumericDate {
|
||||||
|
return NewNumericDate(time.Unix(0, int64(f*float64(time.Second))))
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON is an implementation of the json.RawMessage interface and serializes the UNIX epoch
|
||||||
|
// represented in NumericDate to a byte array, using the precision specified in TimePrecision.
|
||||||
|
func (date NumericDate) MarshalJSON() (b []byte, err error) {
|
||||||
|
f := float64(date.Truncate(TimePrecision).UnixNano()) / float64(time.Second)
|
||||||
|
|
||||||
|
return []byte(strconv.FormatFloat(f, 'f', -1, 64)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON is an implementation of the json.RawMessage interface and deserializses a
|
||||||
|
// NumericDate from a JSON representation, i.e. a json.Number. This number represents an UNIX epoch
|
||||||
|
// with either integer or non-integer seconds.
|
||||||
|
func (date *NumericDate) UnmarshalJSON(b []byte) (err error) {
|
||||||
|
var (
|
||||||
|
number json.Number
|
||||||
|
f float64
|
||||||
|
)
|
||||||
|
|
||||||
|
if err = json.Unmarshal(b, &number); err != nil {
|
||||||
|
return fmt.Errorf("could not parse NumericData: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if f, err = number.Float64(); err != nil {
|
||||||
|
return fmt.Errorf("could not convert json number value to float: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
n := newNumericDateFromSeconds(f)
|
||||||
|
*date = *n
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClaimStrings is basically just a slice of strings, but it can be either serialized from a string array or just a string.
|
||||||
|
// This type is necessary, since the "aud" claim can either be a single string or an array.
|
||||||
|
type ClaimStrings []string
|
||||||
|
|
||||||
|
func (s *ClaimStrings) UnmarshalJSON(data []byte) (err error) {
|
||||||
|
var value interface{}
|
||||||
|
|
||||||
|
if err = json.Unmarshal(data, &value); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var aud []string
|
||||||
|
|
||||||
|
switch v := value.(type) {
|
||||||
|
case string:
|
||||||
|
aud = append(aud, v)
|
||||||
|
case []string:
|
||||||
|
aud = ClaimStrings(v)
|
||||||
|
case []interface{}:
|
||||||
|
for _, vv := range v {
|
||||||
|
vs, ok := vv.(string)
|
||||||
|
if !ok {
|
||||||
|
return &json.UnsupportedTypeError{Type: reflect.TypeOf(vv)}
|
||||||
|
}
|
||||||
|
aud = append(aud, vs)
|
||||||
|
}
|
||||||
|
case nil:
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
return &json.UnsupportedTypeError{Type: reflect.TypeOf(v)}
|
||||||
|
}
|
||||||
|
|
||||||
|
*s = aud
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s ClaimStrings) MarshalJSON() (b []byte, err error) {
|
||||||
|
// This handles a special case in the JWT RFC. If the string array, e.g. used by the "aud" field,
|
||||||
|
// only contains one element, it MAY be serialized as a single string. This may or may not be
|
||||||
|
// desired based on the ecosystem of other JWT library used, so we make it configurable by the
|
||||||
|
// variable MarshalSingleStringAsArray.
|
||||||
|
if len(s) == 1 && !MarshalSingleStringAsArray {
|
||||||
|
return json.Marshal(s[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
return json.Marshal([]string(s))
|
||||||
|
}
|
4
vendor/modules.txt
vendored
4
vendor/modules.txt
vendored
|
@ -116,9 +116,9 @@ github.com/go-sql-driver/mysql
|
||||||
github.com/gogits/go-gogs-client
|
github.com/gogits/go-gogs-client
|
||||||
# github.com/gogo/protobuf v1.3.2
|
# github.com/gogo/protobuf v1.3.2
|
||||||
github.com/gogo/protobuf/proto
|
github.com/gogo/protobuf/proto
|
||||||
# github.com/golang-jwt/jwt v3.2.2+incompatible
|
# github.com/golang-jwt/jwt/v4 v4.1.0
|
||||||
## explicit
|
## explicit
|
||||||
github.com/golang-jwt/jwt
|
github.com/golang-jwt/jwt/v4
|
||||||
# github.com/golang/protobuf v1.5.2
|
# github.com/golang/protobuf v1.5.2
|
||||||
## explicit
|
## explicit
|
||||||
github.com/golang/protobuf/proto
|
github.com/golang/protobuf/proto
|
||||||
|
|
Loading…
Reference in a new issue