Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 148d710

Browse files
oxistoMicahParksmfridman
authored
v5 Pre-Release (#234)
Co-authored-by: Micah Parks <66095735+MicahParks@users.noreply.github.com> Co-authored-by: Michael Fridman <mf192@icloud.com>
1 parent 4fd5621 commit 148d710

37 files changed

+1513
-767
lines changed

‎.github/workflows/build.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
strategy:
2626
fail-fast: false
2727
matrix:
28-
go: [1.17, 1.18, 1.19]
28+
go: ["1.18", "1.19", "1.20"]
2929
steps:
3030
- name: Checkout
3131
uses: actions/checkout@v3

‎MIGRATION_GUIDE.md‎

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,82 @@
1-
## Migration Guide (v4.0.0)
1+
# Migration Guide (v5.0.0)
2+
3+
Version `v5` contains a major rework of core functionalities in the `jwt-go` library. This includes support for several
4+
validation options as well as a re-design of the `Claims` interface. Lastly, we reworked how errors work under the hood,
5+
which should provide a better overall developer experience.
6+
7+
Starting from [v5.0.0](https://github.com/golang-jwt/jwt/releases/tag/v5.0.0), the import path will be:
8+
9+
"github.com/golang-jwt/jwt/v5"
10+
11+
For most users, changing the import path *should* suffice. However, since we intentionally changed and cleaned some of
12+
the public API, existing programs might need to be adopted. The following paragraphs go through the individual changes
13+
and make suggestions how to change existing programs.
14+
15+
## Parsing and Validation Options
16+
17+
Under the hood, a new `validator` struct takes care of validating the claims. A long awaited feature has been the option
18+
to fine-tune the validation of tokens. This is now possible with several `ParserOption` functions that can be appended
19+
to most `Parse` functions, such as `ParseWithClaims`. The most important options and changes are:
20+
* `WithLeeway`, which can be used to specific leeway that is taken into account when validating time-based claims, such as `exp` or `nbf`.
21+
* The new default behavior now disables checking the `iat` claim by default. Usage of this claim is OPTIONAL according to the JWT RFC. The claim itself is also purely informational according to the RFC, so a strict validation failure is not recommended. If you want to check for sensible values in these claims, please use the `WithIssuedAt` parser option.
22+
* New options have also been added to check for expected `aud`, `sub` and `iss`, namely `WithAudience`, `WithSubject` and `WithIssuer`.
23+
24+
## Changes to the `Claims` interface
25+
26+
### Complete Restructuring
27+
28+
Previously, the claims interface was satisfied with an implementation of a `Valid() error` function. This had several issues:
29+
* The different claim types (struct claims, map claims, etc.) then contained similar (but not 100 % identical) code of how this validation was done. This lead to a lot of (almost) duplicate code and was hard to maintain
30+
* It was not really semantically close to what a "claim" (or a set of claims) really is; which is a list of defined key/value pairs with a certain semantic meaning.
31+
32+
Since all the validation functionality is now extracted into the validator, all `VerifyXXX` and `Valid` functions have been removed from the `Claims` interface. Instead, the interface now represents a list of getters to retrieve values with a specific meaning. This allows us to completely decouple the validation logic with the underlying storage representation of the claim, which could be a struct, a map or even something stored in a database.
33+
34+
```go
35+
type Claims interface {
36+
GetExpirationTime() (*NumericDate, error)
37+
GetIssuedAt() (*NumericDate, error)
38+
GetNotBefore() (*NumericDate, error)
39+
GetIssuer() (string, error)
40+
GetSubject() (string, error)
41+
GetAudience() (ClaimStrings, error)
42+
}
43+
```
44+
45+
### Supported Claim Types and Removal of `StandardClaims`
46+
47+
The two standard claim types supported by this library, `MapClaims` and `RegisteredClaims` both implement the necessary functions of this interface. The old `StandardClaims` struct, which has already been deprecated in `v4` is now removed.
48+
49+
Users using custom claims, in most cases, will not experience any changes in the behavior as long as they embedded
50+
`RegisteredClaims`. If they created a new claim type from scratch, they now need to implemented the proper getter
51+
functions.
52+
53+
### Migrating Application Specific Logic of the old `Valid`
54+
55+
Previously, users could override the `Valid` method in a custom claim, for example to extend the validation with application-specific claims. However, this was always very dangerous, since once could easily disable the standard validation and signature checking.
56+
57+
In order to avoid that, while still supporting the use-case, a new `ClaimsValidator` interface has been introduced. This interface consists of the `Validate() error` function. If the validator sees, that a `Claims` struct implements this interface, the errors returned to the `Validate` function will be *appended* to the regular standard validation. It is not possible to disable the standard validation anymore (even only by accident).
58+
59+
Usage examples can be found in [example_test.go](./example_test.go), to build claims structs like the following.
60+
61+
```go
62+
// MyCustomClaims includes all registered claims, plus Foo.
63+
type MyCustomClaims struct {
64+
Foo string `json:"foo"`
65+
jwt.RegisteredClaims
66+
}
67+
68+
// Validate can be used to execute additional application-specific claims
69+
// validation.
70+
func (m MyCustomClaims) Validate() error {
71+
if m.Foo != "bar" {
72+
return errors.New("must be foobar")
73+
}
74+
75+
return nil
76+
}
77+
```
78+
79+
# Migration Guide (v4.0.0)
280

381
Starting from [v4.0.0](https://github.com/golang-jwt/jwt/releases/tag/v4.0.0), the import path will be:
482

@@ -8,7 +86,7 @@ The `/v4` version will be backwards compatible with existing `v3.x.y` tags in th
886
`github.com/dgrijalva/jwt-go`. For most users this should be a drop-in replacement, if you're having
987
troubles migrating, please open an issue.
1088

11-
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`.
89+
You can replace all occurrences of `github.com/dgrijalva/jwt-go` or `github.com/golang-jwt/jwt` with `github.com/golang-jwt/jwt/v5`, either manually or by using tools such as `sed` or `gofmt`.
1290

1391
And then you'd typically run:
1492

@@ -17,6 +95,6 @@ go get github.com/golang-jwt/jwt/v4
1795
go mod tidy
1896
```
1997

20-
## Older releases (before v3.2.0)
98+
# Older releases (before v3.2.0)
2199

22100
The original migration guide for older releases can be found at https://github.com/dgrijalva/jwt-go/blob/master/MIGRATION_GUIDE.md.

‎README.md‎

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# jwt-go
22

33
[![build](https://github.com/golang-jwt/jwt/actions/workflows/build.yml/badge.svg)](https://github.com/golang-jwt/jwt/actions/workflows/build.yml)
4-
[![Go Reference](https://pkg.go.dev/badge/github.com/golang-jwt/jwt/v4.svg)](https://pkg.go.dev/github.com/golang-jwt/jwt/v4)
4+
[![Go Reference](https://pkg.go.dev/badge/github.com/golang-jwt/jwt/v5.svg)](https://pkg.go.dev/github.com/golang-jwt/jwt/v5)
55

66
A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](https://datatracker.ietf.org/doc/html/rfc7519).
77

88
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`.
9-
See the [`MIGRATION_GUIDE.md`](./MIGRATION_GUIDE.md) for more information.
9+
See the [`MIGRATION_GUIDE.md`](./MIGRATION_GUIDE.md) for more information. Version v5.0.0 introduces major improvements to the validation of tokens, but is not entirely backwards compatible.
1010

1111
> 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.
1212
@@ -41,22 +41,22 @@ This library supports the parsing and verification as well as the generation and
4141
1. To install the jwt package, you first need to have [Go](https://go.dev/doc/install) installed, then you can use the command below to add `jwt-go` as a dependency in your Go program.
4242

4343
```sh
44-
go get -u github.com/golang-jwt/jwt/v4
44+
go get -u github.com/golang-jwt/jwt/v5
4545
```
4646

4747
2. Import it in your code:
4848

4949
```go
50-
import "github.com/golang-jwt/jwt/v4"
50+
import "github.com/golang-jwt/jwt/v5"
5151
```
5252

5353
## Examples
5454

55-
See [the project documentation](https://pkg.go.dev/github.com/golang-jwt/jwt/v4) for examples of usage:
55+
See [the project documentation](https://pkg.go.dev/github.com/golang-jwt/jwt/v5) for examples of usage:
5656

57-
* [Simple example of parsing and validating a token](https://pkg.go.dev/github.com/golang-jwt/jwt/v4#example-Parse-Hmac)
58-
* [Simple example of building and signing a token](https://pkg.go.dev/github.com/golang-jwt/jwt/v4#example-New-Hmac)
59-
* [Directory of Examples](https://pkg.go.dev/github.com/golang-jwt/jwt/v4#pkg-examples)
57+
* [Simple example of parsing and validating a token](https://pkg.go.dev/github.com/golang-jwt/jwt/v5#example-Parse-Hmac)
58+
* [Simple example of building and signing a token](https://pkg.go.dev/github.com/golang-jwt/jwt/v5#example-New-Hmac)
59+
* [Directory of Examples](https://pkg.go.dev/github.com/golang-jwt/jwt/v5#pkg-examples)
6060

6161
## Extensions
6262

@@ -68,7 +68,7 @@ A common use case would be integrating with different 3rd party signature provid
6868
| --------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
6969
| GCP | Integrates with multiple Google Cloud Platform signing tools (AppEngine, IAM API, Cloud KMS) | https://github.com/someone1/gcp-jwt-go |
7070
| AWS | Integrates with AWS Key Management Service, KMS | https://github.com/matelang/jwt-go-aws-kms |
71-
| JWKS | Provides support for JWKS ([RFC 7517](https://datatracker.ietf.org/doc/html/rfc7517)) as a `jwt.Keyfunc` | https://github.com/MicahParks/keyfunc |
71+
| JWKS | Provides support for JWKS ([RFC 7517](https://datatracker.ietf.org/doc/html/rfc7517)) as a `jwt.Keyfunc` | https://github.com/MicahParks/keyfunc |
7272

7373
*Disclaimer*: Unless otherwise specified, these integrations are maintained by third parties and should not be considered as a primary offer by any of the mentioned cloud providers
7474

@@ -110,10 +110,10 @@ Asymmetric signing methods, such as RSA, use different keys for signing and veri
110110

111111
Each signing method expects a different object type for its signing keys. See the package documentation for details. Here are the most common ones:
112112

113-
* The [HMAC signing method](https://pkg.go.dev/github.com/golang-jwt/jwt/v4#SigningMethodHMAC) (`HS256`,`HS384`,`HS512`) expect `[]byte` values for signing and validation
114-
* The [RSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt/v4#SigningMethodRSA) (`RS256`,`RS384`,`RS512`) expect `*rsa.PrivateKey` for signing and `*rsa.PublicKey` for validation
115-
* The [ECDSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt/v4#SigningMethodECDSA) (`ES256`,`ES384`,`ES512`) expect `*ecdsa.PrivateKey` for signing and `*ecdsa.PublicKey` for validation
116-
* The [EdDSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt/v4#SigningMethodEd25519) (`Ed25519`) expect `ed25519.PrivateKey` for signing and `ed25519.PublicKey` for validation
113+
* The [HMAC signing method](https://pkg.go.dev/github.com/golang-jwt/jwt/v5#SigningMethodHMAC) (`HS256`,`HS384`,`HS512`) expect `[]byte` values for signing and validation
114+
* The [RSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt/v5#SigningMethodRSA) (`RS256`,`RS384`,`RS512`) expect `*rsa.PrivateKey` for signing and `*rsa.PublicKey` for validation
115+
* The [ECDSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt/v5#SigningMethodECDSA) (`ES256`,`ES384`,`ES512`) expect `*ecdsa.PrivateKey` for signing and `*ecdsa.PublicKey` for validation
116+
* The [EdDSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt/v5#SigningMethodEd25519) (`Ed25519`) expect `ed25519.PrivateKey` for signing and `ed25519.PublicKey` for validation
117117

118118
### JWT and OAuth
119119

@@ -131,7 +131,7 @@ This library uses descriptive error messages whenever possible. If you are not g
131131

132132
## More
133133

134-
Documentation can be found [on pkg.go.dev](https://pkg.go.dev/github.com/golang-jwt/jwt/v4).
134+
Documentation can be found [on pkg.go.dev](https://pkg.go.dev/github.com/golang-jwt/jwt/v5).
135135

136136
The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in the documentation.
137137

‎VERSION_HISTORY.md‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1-
## `jwt-go` Version History
1+
# `jwt-go` Version History
22

3-
#### 4.0.0
3+
The following version history is kept for historic purposes. To retrieve the current changes of each version, please refer to the change-log of the specific release versions on https://github.com/golang-jwt/jwt/releases.
4+
5+
## 4.0.0
46

57
* Introduces support for Go modules. The `v4` version will be backwards compatible with `v3.x.y`.
68

7-
#### 3.2.2
9+
## 3.2.2
810

911
* 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)).
1012
* Fixed a potential issue that could occur when the verification of `exp`, `iat` or `nbf` was not required and contained invalid contents, i.e. non-numeric/date. Thanks for @thaJeztah for making us aware of that and @giorgos-f3 for originally reporting it to the formtech fork ([#40](https://github.com/golang-jwt/jwt/pull/40)).
1113
* Added support for EdDSA / ED25519 ([#36](https://github.com/golang-jwt/jwt/pull/36)).
1214
* Optimized allocations ([#33](https://github.com/golang-jwt/jwt/pull/33)).
1315

14-
#### 3.2.1
16+
## 3.2.1
1517

1618
* **Import Path Change**: See MIGRATION_GUIDE.md for tips on updating your code
1719
* Changed the import path from `github.com/dgrijalva/jwt-go` to `github.com/golang-jwt/jwt`
@@ -117,17 +119,17 @@ It is likely the only integration change required here will be to change `func(t
117119
* Refactored the RSA implementation to be easier to read
118120
* Exposed helper methods `ParseRSAPrivateKeyFromPEM` and `ParseRSAPublicKeyFromPEM`
119121

120-
#### 1.0.2
122+
## 1.0.2
121123

122124
* Fixed bug in parsing public keys from certificates
123125
* Added more tests around the parsing of keys for RS256
124126
* Code refactoring in RS256 implementation. No functional changes
125127

126-
#### 1.0.1
128+
## 1.0.1
127129

128130
* Fixed panic if RS256 signing method was passed an invalid key
129131

130-
#### 1.0.0
132+
## 1.0.0
131133

132134
* First versioned release
133135
* API stabilized

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /