Skip to content

Releases: golang-jwt/jwt

v5.0.0-rc.1

21 Feb 13:52
148d710
Compare
Choose a tag to compare
v5.0.0-rc.1 Pre-release
Pre-release

🚨 New major version v5 (release candidate 1) 🚨

Huge kudos to @oxisto for pushing this 10+ year-old project further and building a solid foundation. We don't take breaking changes lightly, but the changes outlined below were necessary to address some of the shortcomings of the previous API.

Version v5 contains a major rework of core functionalities in the jwt-go library. This includes support for several validation options as well as a re-design of the Claims interface. Lastly, we reworked how errors work under the hood, which should provide a better overall developer experience.

Starting from v5, the import path will be:

"github.com/golang-jwt/jwt/v5"

For most users, changing the import path should suffice. However, since we intentionally changed and cleaned some of the public API, existing programs might need to be adopted. The following paragraphs go through the individual changes and make suggestions how to change existing programs.

The existing v4 version is available on the v4 branch at commit 9358574

Parsing and Validation Options

Under the hood, a new validator struct takes care of validating the claims. A long awaited feature has been the option to fine-tune the validation of tokens. This is now possible with several ParserOption functions that can be appended to most Parse functions, such as ParseWithClaims. The most important options and changes are:

  • WithLeeway, which can be used to specific leeway that is taken into account when validating time-based claims, such as exp or nbf.
  • 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.
  • New options have also been added to check for expected aud, sub and iss, namely WithAudience, WithSubject and WithIssuer.

Changes to the Claims interface

Complete Restructuring

Previously, the claims interface was satisfied with an implementation of a Valid() error function. This had several issues:

  • 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
  • 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.

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.

type Claims interface {
	GetExpirationTime() (*NumericDate, error)
	GetIssuedAt() (*NumericDate, error)
	GetNotBefore() (*NumericDate, error)
	GetIssuer() (string, error)
	GetSubject() (string, error)
	GetAudience() (ClaimStrings, error)
}

Supported Claim Types and Removal of StandardClaims

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.

Users using custom claims, in most cases, will not experience any changes in the behavior as long as they embedded RegisteredClaims. If they created a new claim type from scratch, they now need to implemented the proper getter functions.

Migrating Application Specific Logic of the old Valid

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.

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).

Usage examples can be found in example_test.go, to build claims structs like the following.

// MyCustomClaims includes all registered claims, plus Foo.
type MyCustomClaims struct {
	Foo string `json:"foo"`
	jwt.RegisteredClaims
}

// Validate can be used to execute additional application-specific claims
// validation.
func (m MyCustomClaims) Validate() error {
	if m.Foo != "bar" {
		return errors.New("must be foobar")
	}

	return nil
}

v4.5.0

19 Feb 11:55
9358574
Compare
Choose a tag to compare

What's Changed

Full Changelog: v4.4.3...v4.5.0

v4.4.3

29 Nov 14:24
2101c1f
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v4.4.2...v4.4.3

v4.4.2

23 Jun 02:08
9294af5
Compare
Choose a tag to compare

What's Changed

  • Added MicahParks/keyfunc to extensions by @oxisto in #194
  • Update link to v4 on pkg.go.dev page by @polRk in #195
  • add installation guidelines to the README file by @morelmiles in #204
  • chore: replace ioutil with io and os by @estensen in #198
  • CI check for Go code formatting by @mfridman in #206
  • Create SECURITY.md by @mfridman in #171
  • Update SECURITY.md by @oxisto in #207
  • Fixed integer overflow in NumericDate.MarshalJSON by @qqiao in #200
  • Claims in rsa_test.go Table Driven Test are Unused by @gkech in #212

New Contributors

Full Changelog: v4.4.1...v4.4.2

v4.4.1

26 Mar 14:18
0972257
Compare
Choose a tag to compare

What's Changed

Note, this release contains a Go module retraction for a prior release v4.4.0:

retract (
    v4.4.0 // Contains a backwards incompatible change to the Claims interface.
)

Full Changelog: v4.4.0...v4.4.1

v4.4.0

16 Mar 23:47
d489c99
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v4.3.0...v4.4.0

v4.3.0

10 Feb 02:58
279dd19
Compare
Choose a tag to compare

What's Changed

  • Support errors.Is for token extractors by @stefantds in #141
  • Implementing Is(err) bool to support Go 1.13 style error checking by @oxisto in #136
  • remove unnecessary for loop in token signing string for readability by @hyeonjae in #34
  • updated README.md to contain more extensions by @matelang in #155
  • Add JWT logo attribution by @mfridman in #161
  • fix: fixed typo detect by cSpell by @giautm in #164
  • Set json encoding precision by @mfridman in #162

New Contributors

Full Changelog: v4.2.0...v4.3.0

v4.2.0

03 Dec 18:37
c435f38
Compare
Choose a tag to compare

v4.1.0

24 Sep 21:44
fd8cd69
Compare
Choose a tag to compare

v4.0.0

03 Aug 16:58
2ebb50f
Compare
Choose a tag to compare
  • Adds Go module support (#41). You can import this package using the following import path:
github.com/golang-jwt/jwt/v4

This release, and any future /v4 work is intended to be backwards-compatible with existing v3.x.y tags.

See the migration guide for more details.