dart_jsonwebtoken
3.4.1An easy to use JSON Web Token (JWT) implementation in Dart with all algorithms supported.
Readme
JSON Web Token (JWT)
An easy to use JSON Web Token implementation in Dart (all algorithms supported).
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
dart_jsonwebtoken allows you to sign, decode and verify JWT.
Examples
Check out the Example File for a full example code of all the different algorithms.
You can also check out the jwt.io website for more information.
Usage
Import
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
Creating & signing a JWT
// Generate a JSON Web Token
// You can provide the payload as a key-value map or a string
final jwt = JWT(
// Payload
{
'id': 123,
'server': {
'id': '3e4fc296',
'loc': 'euw-2',
}
},
issuer: 'https://github.com/jonasroussel/dart_jsonwebtoken',
);
// Sign it (default with HS256 algorithm)
final token = jwt.sign(SecretKey('secret passphrase'));
print('Signed token: $token\n');
Verifying a JWT
try {
// Verify a token (SecretKey for HMAC & PublicKey for all the others)
final jwt = JWT.verify(token, SecretKey('secret passphrase'));
print('Payload: ${jwt.payload}');
} on JWTExpiredException {
print('jwt expired');
} on JWTException catch (ex) {
print(ex.message); // ex: invalid signature
}
Decoding without verification
You can decode a token without checking its signature (e.g. for inspection). Do not use this for authorization—always verify with JWT.verify when trusting the token.
final jwt = JWT.decode(token);
print('Payload: ${jwt.payload}');
Key creation for all algorithms
The raw PEM content below is for learning only. In production, read private and public keys from files and pass their contents (as strings) to the constructors.
// HS256, HS384, HS512
final hmacKey = SecretKey('secret passphrase');
// RS256, RS384, RS512, PS256, PS384, PS512
final rsaPrivKey = RSAPrivateKey('''
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAq5QLAv9kYTgelglIhC17KdfUoinkwvQ4F0TZAp7qgmu19dCx
...
-----END RSA PRIVATE KEY-----
''');
// You can also extract the public key from a certificate with RSAPublicKey.cert(...)
final rsaPubKey = RSAPublicKey('''
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq5QLAv9kYTgelglIhC17
...
-----END PUBLIC KEY-----
'''
);
// ES256, ES256K, ES384, ES512
final ecPrivKey = ECPrivateKey('''
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgevZzL1gdAFr88hb2
...
-----END PRIVATE KEY-----
''');
// You can also extract the public key from a certificate with ECPublicKey.cert(...)
final ecPubKey = ECPublicKey('''
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEVs/o5+uQbTjL3chynL4wXgUg2R9
...
-----END PUBLIC KEY-----
''');
// EdDSA
final edPrivKey = EdDSAPrivateKey.fromPEM('''-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEICXCjBHvjArjXquUI5jo3x5SHI4ofZA2azwJ39IC/Qct
-----END PRIVATE KEY-----
''');
final edPubKey = EdDSAPublicKey.fromPEM('''-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAEi7MNW0Q9T83UA3Rw+8DbspMgqeuxCqa2wXaWS+tHqY=
-----END PUBLIC KEY-----
''');
Supported Algorithms
| JWT Algorithms | Digital Signature or MAC Algorithm |
|---|---|
| HS256 | HMAC using SHA-256 hash algorithm |
| HS384 | HMAC using SHA-384 hash algorithm |
| HS512 | HMAC using SHA-512 hash algorithm |
| PS256 | RSASSA-PSS using SHA-256 hash algorithm |
| PS384 | RSASSA-PSS using SHA-384 hash algorithm |
| PS512 | RSASSA-PSS using SHA-512 hash algorithm |
| RS256 | RSASSA-PKCS1-v1_5 using SHA-256 hash algorithm |
| RS384 | RSASSA-PKCS1-v1_5 using SHA-384 hash algorithm |
| RS512 | RSASSA-PKCS1-v1_5 using SHA-512 hash algorithm |
| ES256 | ECDSA using P-256 curve and SHA-256 hash algorithm |
| ES256K | ECDSA using secp256k curve and SHA-256 hash algorithm |
| ES384 | ECDSA using P-384 curve and SHA-384 hash algorithm |
| ES512 | ECDSA using P-521 curve and SHA-512 hash algorithm |
| EdDSA | EdDSA using ed25519 curve and SHA-512 hash algorithm |
Changelog
3.4.1
- Fix
audlist verification crashing on JSON-decoded tokens (List<dynamic>toList<String>cast) - Add defensive type guards on
exp,nbfandiatclaims (throwJWTInvalidExceptioninstead of runtime error) - Adopt
package:lints/recommendedwith strict-casts/inference - Internal lint cleanups (
super.message, string interpolation, remove deprecatedlibrarydirective)
3.4.0
- Replace ed25519_edwards with vendored Ed25519 implementation (enable dart2wasm compilation)
- RSA PKCS1-v1_5 sign/verify (enable RSA algorithm for node.js)
3.3.2
- Use constant-time comparison for HMAC signature verification (timing-attack resistant)
- Handle non-Map payload in
JWT.decode(audience, issuer, subject, jwtId) - Allow
audclaim as genericListin_parseAud - Fix
ECPrivateKey.bytes, derive EC private key size from parameters
3.3.1
- Rollback to a
dynamicJWT.payload
3.3.0
- RETRACTED
- Increase
JWT.payloadstrictness (https://github.com/jonasroussel/dart_jsonwebtoken/issues/67)
3.2.0
- Update upper bound of pointycastle (https://github.com/jonasroussel/dart_jsonwebtoken/pull/65)
- Dart SDK minimum version set to 3.0.0
- Use
pointycastlefor HMAC calculation instead ofcrypto - Implement custom deep list equality instead of using the
collectionpackage
3.1.1
- Rollback
collectionto 1.17.1 to be compatible with older flutter versions
3.1.0
- Fix unconsistant JWK convertion
- Add
JWTKey.fromJWKstatic method for parsing JWK to various key types
3.0.0
- Possible BREAKING CHANGE:
exp,nbfandiatare now following the JWT RFC for NumericDate by only using UTC DateTime - Add JWK (JSON Web Key) conversion methods to key classes (
toJWK()) - Fix HMAC secret auto detect if base64 is url or not
- Fix base64Url instead of base64 for string payloads JWT
- Add header tests for
exp,nbfandiat
2.17.0
- Parse standard parameters when using
JWT.decode(https://github.com/jonasroussel/dart_jsonwebtoken/pull/64)
2.16.0
- Add support of PEM parsing for EdDSA keys with
EdDSAPrivateKey.fromPemandEdDSAPublicKey.fromPem
2.15.0
- Added support for PSS alogrithm varations (https://github.com/jonasroussel/dart_jsonwebtoken/pull/59)
2.14.2
- Ensure
sub,iss,jtiare strings (https://github.com/jonasroussel/dart_jsonwebtoken/pull/62)
2.14.1
- Fix
iatclaim verification (https://github.com/jonasroussel/dart_jsonwebtoken/pull/57)
2.14.0
- Add support for base64 encoded secrets (https://github.com/jonasroussel/dart_jsonwebtoken/pull/54)
- Fix
exp,nbfandiatchecks by casting the value toint
2.13.0
- Fix invalid ECDSA signature for keys that are not a multiple of 8 (e.g. secp521r1) (https://github.com/jonasroussel/dart_jsonwebtoken/issues/51)
2.12.2
- Add testable date times (https://github.com/jonasroussel/dart_jsonwebtoken/issues/50)
2.12.1
- Fixing issue with custom headers (https://github.com/jonasroussel/dart_jsonwebtoken/issues/48)
2.12.0
- NEW: tests have been added
- NEW: publish & test CI
- Making all
JWTAlgorithmclasses public (mainly to be mocked in tests)
2.11.0
- Removing
basic_utilspackage that was incompatible with flutter web - Moving utils to
helpers.dartand key parsing functions intokey_parser.dart - Adding some new examples in
example/example.dart
2.10.0
- New ECDSA algorithm (ES256K)
- New RSA algorithm with PSS padding (PS256, PS384, PS512)
- README.md improved
- example/example.dart improved
2.9.1
- Adding a new class factory
ECPublicKey.cert
2.9.0
- Adding
basic_utilspackage to handle PEM & key parsing - A lot of new class factory to create
Keys(e.g.RSAPublicKey.certand.bytes)
2.8.2
- Downgraing
collectionto 1.7.1 to be compatible with flutter_test
2.8.1
- Updating dependencies
- Fixing
CHANGELOG.md
2.8.0
- BREAKING CHANGE: Replacing all JWTError by JWTException that is more accurate (https://github.com/jonasroussel/dart_jsonwebtoken/issues/39)
- Fixing assert message (https://github.com/jonasroussel/dart_jsonwebtoken/pull/42)
2.7.1
- Migrating from
pedantictolints
2.7.0
parsing.darthas been replaced by more accurate CryptoUtils functionshttps://github.com/Ephenodrom/Dart-Basic-Utils- Fixing
_ECDSAAlgorithm.signmethod that did not filling the gap in the ECDSA curve signatures
2.6.4
- Fixing
ECPrivateKey.rawinitializesize
2.6.3
- Adding a
.rawand.cloneconstructor toJWTKey(execptSecretKeyof course)
2.6.2
- Fix rethrow of JWTError exceptions for the method
verify. Before this change every exception thrown byverifyalways returned JWTUndefinedError
2.6.1
- Adding a
tryversion ofdecode,verifyandsign, that simply returnsnullinstead of throwing errors
2.6.0
- Adding a
JWT.decodemethod to simply decode a token without checking its signature - The
JWT.verifymethod do not remove extra token infos (iss,aud, ...) anymore
2.5.1
- Fix Flutter compatibility issue:
downgradedependency collection to1.16.0
2.5.0
2.4.2
- Formating for 'static analysis'
2.4.1
2.4.0
- BREAKING CHANGE:
JWT.audienceis now an instance of theAudienceclass, to handle multiple audience entries and can be used like list. You can always use a single entry by callingAudience.one('...')factory and the.firstgetter - Upgrading
pointycastledependency to3.3.4
2.3.2
- Some badges on
README.md(Thanks to https://github.com/bruno-garcia/badges.bar)
2.3.1
- Fix the
pointycastledependency,v3.1.3is incompatible with flutter web (dart2js) (https://github.com/jonasroussel/dart_jsonwebtoken/issues/14)
2.3.0
- Adding
headerin JWT class (you can now set your custom header)
2.2.0
- Fixing EdDSA incompatibility's with flutter web (https://github.com/jonasroussel/dart_jsonwebtoken/issues/11)
- Dependencies:
ed25519_edwardshave been removed,convert&collectionhave been added
2.1.1
- Fixing
_pkcs8ECPublicKeyto work with pointycastle 3.0.1
2.1.0
- When an undefined error occur
JWTUndefinedErroris thrown containing the original error inerrorproperty (https://github.com/jonasroussel/dart_jsonwebtoken/issues/9) - BREAKING CHANGE:
jwt.verifyno longer supportthrowUndefinedErrorsparameter
2.0.1
- Fixing
JWT.signto includeiat& other attributes when payload is an empty Map
2.0.0
- Stable release for null safety
2.0.0-nullsafety.2
- New EdDSA Algorithm (EdDSA)
- EdDSAPrivateKey and EdDSAPublicKey, two new keys for EdDSA algorithm
ed25519_edwardspackage has been added
2.0.0-nullsafety.1
- Null safety migration of this package
1.6.2
- Adding
analysis_options.yamlto work with pedantic during development
1.6.1
- Formating for 'static analysis'
1.6.0
- New ECDSA Algorithm (ES256, ES384, ES512)
- ECPrivateKey and ECPublicKey, two new keys for ECDSA algorithm
- PrivateKey is renamed in RSAPrivateKey
- PublicKey is renamed in RSAPublicKey
- Optimization of private & public keys parsing
rsa_pkcs&cryptographyhave been removed
1.5.0
- Debuging
_TypeError issue on sign method(#4) - Implementing
toStringin theJWTErrorclass
1.4.1
- Formating for 'static analysis'
1.4.0
- Implementing
throwUndefinedErrorsoption in theJWT.verifymethod
1.3.1
- Formating for 'static analysis'
1.3.0
- Adding checks in
JWT.verifyfunction foriss, sub, aud, iat, jti
1.2.1
- Formating for 'static analysis'
1.2.0
- Payload is now required
- Payload is now dynamic and not restricted to an object
- Dependencies updated
1.1.0
- New algorithms
1.0.3
- Formating for 'static analysis'
1.0.2
- Docs & examples
1.0.1
- More details on exceptions
- New examples
1.0.0
- New RSA Algorithm (RS256)
- Keys a now using an abstract class 'Key' instead of a string
- SecretKey: for HMAC (HS256)
- PrivateKey & PublicKey: for RSA (RS256)
0.2.1
- Formatting
0.2.0
- Better documentations
0.1.0
- First version with every based features
Installing
export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add dart_jsonwebtokenpubspec.yaml
name: dart_jsonwebtoken
description: An easy to use JSON Web Token (JWT) implementation in Dart with all algorithms supported.
version: 3.4.1
repository: https://github.com/jonasroussel/dart_jsonwebtoken
homepage: https://dart-jwt.dev
environment:
sdk: ">=3.0.0 <4.0.0"
false_secrets:
- /example/*.pem
- /test/*
- /README.md
dependencies:
clock: ^1.1.2
convert: ^3.1.2
pointycastle: ^4.0.0
dev_dependencies:
fake_async: ^1.3.3
lints: ^5.1.1
test: ^1.25.15
Version history
| Version | Published | Archive | SHA-256 |
|---|---|---|---|
| 0.1.0 | On demand | Download | ad1d8908…5c38e9 |
| 0.2.0 | On demand | Download | f1baddbb…b9c32c |
| 0.2.1 | On demand | Download | c57c02d9…91d6d4 |
| 1.0.0 | On demand | Download | 25c3109a…6efb5e |
| 1.0.1 | On demand | Download | 3d951ca0…0be6a8 |
| 1.0.2 | On demand | Download | c662d210…6e4cd9 |
| 1.0.3 | On demand | Download | 04e2c742…7ef061 |
| 1.1.0 | On demand | Download | 9ca443fa…515b2e |
| 1.2.0 | On demand | Download | e77a05b4…1d8691 |
| 1.2.1 | On demand | Download | 3ff3fb97…641b7f |
| 1.3.0 | On demand | Download | 8410ddb3…2b2dc1 |
| 1.3.1 | On demand | Download | a47b61ba…3d20db |
| 1.4.0 | On demand | Download | cfcbcfce…9289b1 |
| 1.4.1 | On demand | Download | 35f46f52…9e0d53 |
| 1.5.0 | On demand | Download | 073c500a…f12ee7 |
| 1.5.1 | On demand | Download | 6dbc383f…33f98c |
| 1.6.0 | On demand | Download | 7fd9cef0…a146c5 |
| 1.6.1 | On demand | Download | ecccd707…40f120 |
| 1.6.2 | On demand | Download | d6aac30b…4b3ae9 |
| 2.0.0-nullsafety.1 | On demand | Download | 04ddee82…8cda6a |
| 2.0.0-nullsafety.2 | On demand | Download | ac8e893b…5d3a36 |
| 2.0.0 | On demand | Download | 433238eb…f50eac |
| 2.0.1 | On demand | Download | 08a19233…be3650 |
| 2.1.0 | On demand | Download | 2d2c8d31…305eed |
| 2.1.1 | On demand | Download | 3006ff86…5438ba |
| 2.2.0 | On demand | Download | dd7f820c…f2dc2d |
| 2.3.0 | On demand | Download | bfb50343…837325 |
| 2.3.1 | On demand | Download | 19f2e9fe…8e888d |
| 2.3.2 | On demand | Download | eca38ec7…b7daee |
| 2.4.0 | On demand | Download | 54580403…af162b |
| 2.4.1 | On demand | Download | 3cc97b37…4840b2 |
| 2.4.2 | On demand | Download | c8c48c29…6b8bcf |
| 2.5.0 | On demand | Download | 99c074c0…319c1e |
| 2.5.1 | On demand | Download | ab9027c7…eea83a |
| 2.6.0 | On demand | Download | 9b77e7d1…d653b4 |
| 2.6.1 | On demand | Download | 1f13eae3…50fec6 |
| 2.6.2 | On demand | Download | c8ad3d86…4446de |
| 2.6.3 | On demand | Download | bae6b00a…fbe03f |
| 2.6.4 | On demand | Download | 0aaa9b49…038fbc |
| 2.7.0 | On demand | Download | b382bb8c…1bf4f6 |
| 2.7.1 | On demand | Download | 2a42e97c…9fe778 |
| 2.8.0 | On demand | Download | f565a768…48d70d |
| 2.8.1 | On demand | Download | 65024de1…598496 |
| 2.8.2 | On demand | Download | e878f2ee…442f4a |
| 2.9.0 | On demand | Download | 6bf04953…398857 |
| 2.9.1 | On demand | Download | 61e0bfb1…e341b2 |
| 2.10.0 | On demand | Download | d562cf89…d2e579 |
| 2.11.0 | On demand | Download | 1c36cca9…49e00a |
| 2.12.0 | On demand | Download | bb4203ac…221b3f |
| 2.12.1 | On demand | Download | 6703695f…5a92b1 |
| 2.12.2 | On demand | Download | 063c20d3…123df7 |
| 2.13.0 | On demand | Download | 40dc3a47…f5b5b9 |
| 2.14.0 | On demand | Download | 346e9a21…92a848 |
| 2.14.1 | On demand | Download | adf07372…330f3f |
| 2.14.2 | On demand | Download | 866787dc…cd04ef |
| 2.15.0 | On demand | Download | 3e95b720…052217 |
| 2.16.0 | On demand | Download | 06e02e18…c4f931 |
| 2.17.0 | On demand | Download | 00a0812d…3f15ef |
| 3.0.0 | On demand | Download | 0c69c028…c120e5 |
| 3.1.0 | On demand | Download | e1b4926c…8c3b86 |
| 3.1.1 | On demand | Download | b268ff9b…0c44d8 |
| 3.2.0 | On demand | Download | 21ce9f8a…3fd413 |
| 3.3.0 | On demand | Download | 1e26ed01…668e65 |
| 3.3.1 | On demand | Download | 0de65691…ff5075 |
| 3.3.2 | On demand | Download | c6ecb3bb…1e0b7a |
| 3.4.0 | On demand | Download | cb79ed79…717c7d |
| 3.4.1 | Cached · Upstream SHA-256 matched | Download | ad84e601…c88fbe |
Dependencies
clock "^1.1.2"
convert "^3.1.2"
pointycastle "^4.0.0"