Description
🎉 Update: The beta is now complete and we've kickstarted an A/B test for v1 vs v2. We'll continue to iterate on feedback shared on this issue, so please keep it coming. For now, you no longer need to enter any passcode to access v2. If you get v1, clear your cookies, refresh, and if the random algo is on your side, you'll get group B (v2).
TL;DR: Please try out the prototype of JWT.io v2
and share feedback with us any feedback that you may have to help us ship an even better JWT debugger than what we had before:
- Head to
https://jwt.io/beta
As mentioned in "The Future of JWT.io", we have been actively working on a new version of the JWT Debugger, and now we have a working prototype that y'all can try out.
Please help us stress test it by using it as you would use JWT.io. We are eager to balance better UI/UX with better design while upholding the most important value proposition of the site: it's a developer tool. Your feedback is critical for us to ship this experience, as we don't want to ship anything that will prevent you from enjoying using this tool. Please reply with your feedback (the good, the bad, and the ugly) or react with emojis--that works too! 🚀
Below is a list of all new features, deprecations, and notable changes (so far) for the migration of JWT.io from v1
to v2
.
Notable Changes
New JWT widgets
- We have divided the JWT Debugger tool into two main widgets, each handling a different JWT operation to provide better error handling and user feedback.
- A JWT decoder
- The decoder takes as input a JWT and outputs its decoded header and payload.
- You can see the decoded output as a JSON object or as a table that includes helpful descriptions, tips, and other metadata about the claims.
- Time-related claims, such as
exp
andiat
, show you the date in a human-readable format. - The decoder now warns you when a JWT has expired.
- You can input a secret or public key to verify its signature.
- We have improved communication about the different encodings and formats that secrets and public keys can have, respectively.
- Secret:
UTF-8
andbase64url
encoding. - Public Key:
PEM
orJWK
formats.
- Time-related claims, such as
- ✨ The decoder now supports decoding unsecured JWTs.
- ✨ Decoding and verifying the signature of JWTs signed with the EdDSA (Ed25519) algorithm is now supported.
- This support is only available on the Firefox and Safari browsers. Learn more about the browsers that support this algorithm here.
- Chrome has provided experimental support since version 113. The experimental flag
#enable-experimental-web-platform-features preference
needs to be set to enabled. Learn more.
- ✨ You can see the decoded header and payload output in a large modal by clicking the resize button next to the copy button.
- A JWT encoder
- The encoder takes as input JSON objects for the header and payload.
- You can input a secret or private key to sign the token, a required step for generating the JWT.
- We have improved communication about the different encodings and formats that secrets and private keys can have, respectively.
- Secret:
UTF-8
andbase64url
encoding. - Private Key:
PEM
orJWK
formats. - The encoder now supports the encoding of unsecured JWTs.
- ✨ Encoding and signing JWTs with the EdDSA (Ed25519) algorithm is now supported with the same constraints present in the decoder widget.
- ✨ The encoder shows a warning when the
alg
claim is not equal toJWT
.
- Both widgets offer better error messages so you can understand why your JWT encoding or decoding is not working and how to fix the issue.
- Both widgets have utility buttons on some of their inputs and outputs to help you perform common operations:
- You can copy the content of some inputs and outputs using a button.
- You can clear the content of inputs with a button click.
- You can "push" the decoder outputs to be input in the encoder and vice versa through a "sync" button.
- This is a feature where we need the most feedback, as the widget split is the biggest UI/UX change.
- The current codebase was not handling errors coherently, and mixing encoding and decoding operations into a single flow was chaotic, leading to swallowed errors or confusing or non-responsive UX.
- You can choose an option to sync the decoder and encoder widgets.
- The outputs of the decoder become the inputs of the encoder and vice versa.
- Errors in the decoder create errors in the encoder and vice versa.
- This behavior is somewhat similar to what jwt.io
v1
does today but it introduces a clear separation layer between decoder and encoder operations to better understand what is triggering an error with the JWT to troubleshoot it more effectively.
Site architecture
- Perhaps the most important architectural change is migrating the code base from JavaScript with Pug and Express to Next.js with TypeScript.
- This new stack gave us a multiplier effect to engineer a better UX and underlying JWT-related services.
- This new stack will help us iterate faster through the application, address feedback faster, and grow its feature set.
- The query parameter used to filter libraries has been updated from
?language=
to?filter=
.- Query parameter values have been updated to use safe URL characters.
- For example, the value for
kdb+/Q
has been changed tokdb-q
. - Old query parameters and values are still supported.
- For example, the value for
- Query parameter values have been updated to use safe URL characters.
- We have migrated from using URL query parameters to preload JWTs into the JWT decoder to URL fragments.
- The only support fragment is
#token=
. - Any other legacy query parameter will redirect to that fragment.
- The only support fragment is
- We crafted the site to support internationalization as we plan to ship a localized version of JWT.io in Japanese next year.
- ✨ The site is now localized in Japanese.
Design
- The site now supports a dark and light theme.
- The hero banner and JWT warning message are much more compact and can be minimized to offer a more streamlined UI suitable for a developer tool.
- We'd love for you to use JWT.io as much as you need. After a few times, or even after one time, you don't need to stare at the same FYI and warnings about copy-pasting JWTs around the web.
- Pickers allow you to select the encoding format for the secret and the format for the private/public key.
- This allows us to provide a better user experience and more insightful error messages.
- Labels around the pickers provide you with a better context of what it does.
- ✨ By default, the site selects your theme based on your system's theme preference.
- However, if you want to use another theme, the site will remember your preference.
User Experience
- The site remembers your preferences using cookies.
- Once you minimize a box or pick a decoded presentation, the site will look as such on your next visit or upon refresh.
- ✨ There are buttons to share feedback or report issues.
- ✨ The library cards now includes the library name as its title instead of the language/framework.
Content
- The introduction has a section that explains the difference between validating and verifying a JWT.
- The introduction has a section that explains the difference between decoding and encoding a JWT.
Deprecations
- Tooltips about JWT claims have been deprecated for the claims breakdown feature.
- This change makes it easier for you to access this information when needed.
- You can hide the description of claims in the decoded output table once you no longer need them.
- Tooltips for time-related claims (e.g.,
exp
,nbf
,iat
,auth_time
, andupdated_at
) that show the time in a readable format have been deprecated in favor of showing the time in the claims breakdown tab. - The tooltip for weak secrets has been deprecated to show a detailed and helpful error message.
- The "Share JWT" feature has been deprecated.
- The "Tokens created" counter has been deprecated.
- Should we bring this back? It's fun to look at but does not serve any functional purpose.
What's next?
- Top priority: Improve accessibility and keyboard navigation (WIP).
- We need to define a process to manage JWT libraries on the directory page.
- When should we remove a library?
- We could reflect helpful information to end-users, such as if a repo connected to the library was archived or if it's showing unmaintained signs.
- I'd like to bring support to the site for encrypted JWTs. Is this something you'd be interested in using directly on the site so we can invest time and resources in it?
- Would you be okay if the website repo were to become private while a repo to submit JWT libraries remains public?
- If you scroll to the footer of both jwt.io
v1
andv2
, you'll notice that we have built several other tools to help developers with identity-related tasks. - I have a vision and mission to update and revamp these other tools and connect them via an "app picker" similar to what Google Chrome offers for Google apps; however, they are a mix of private and public repos. Having them all in a single mono-repo would help accelerate the design and engineering process, but that repo would likely need to be private.
- If you scroll to the footer of both jwt.io
Thank you!
We appreciate your usage of jwt.io and all the feedback we have received throughout the years and recently. Working on jwt.io has been the highlight of my time at Auth0 and Okta. I hope that you get to love using this tool as much as we loved building it for you.