I am working on a web application developed using Java and AngularJS and chose to implement token authentication and authorization. For the exercise purpose, I've come to the point where I send the credentials to the server, generate a random token store it and send it back to the client. At every request to the server I'm attaching the token in the header and it works perfectly. For the authentication point of view is perfect and wouldn't need more.

However, I now want to keep track of the user type (admin, regular user...), as well as it's id, or any other unique field; as I understood I have to encrypt that in the token that I'm sending back to the client during the log in action. Is that correct?

Is there any JWT library that you used and can generate, encrypt and decrypt such tokens? A link to the library's API and Maven dependency would be much appreciated.


  • 1
    If the information that you want to store in the token is not sensitive you don't necessarily need to encrypt the token. Is a user id and permissions something secret? Probably no. What you need to ensure is that only you can create a valid token. The jwt approach is to have the token digitally signed with Hmac and a secret signature key to ensure that you will be able to verify its integrity and origin. My answer below provides a library and example. – Marquez Sep 2 '14 at 19:22
  • 1
    Hi.. I'm trying to implement this JWT library too and I did on the server side ( Java ) but how can I decode in my front end side ( javascript)? Which library did you use to decode it on the angularjs part? – Thiago Miranda de Oliveira Sep 23 '14 at 17:34
  • Thiago, I didn't. The flow was as follows: User logs in -> data sent to server -> token created -> sent back to client. Whenever a request is done to the server, the token was appended in the header (I've implemented an interceptor for this). The validation was done on the server and correct response was sent back (if it was authorized or not). – Marius Manastireanu Sep 24 '14 at 13:32
  • 2
    A useful page when dealing with JWT: jwt.io – Vilmantas Baranauskas Feb 9 '15 at 7:56
  • @MariusManastireanu The token that you are sending from angular is the same token you received from server?? I am working on the same part...please help – Satyadev Jan 1 '16 at 18:38

JJWT aims to be the easiest to use and understand JWT library for the JVM and Android:


  • 3
    Simple, easy and clean, and worked immediately. I went for the Google JsonToken first and switched here after messing with unresolved dependencies and pages of code to assemble a simple JWT. – Oliver Hausler Feb 12 '15 at 0:17
  • 1
    How can I prevent token theft? – JHS Mar 29 '15 at 21:46
  • How can I handle Token Timeout like in nodejs-jsonwebtoken – vanduc1102 Apr 16 '15 at 8:23
  • I'm able to use jjwt in a simple test program. But when I try using it in my dropwizard application I get the following error at startup: java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS. Thoughts? – Ya. May 22 '15 at 16:22
  • 1
    "How can I handle Token Timeout" - Per jwt spec you need to set the "exp" claim. Jjwt provides a convenient "setExpiration" method for this. – Ya. May 22 '15 at 16:28

If anyone in the need for an answer,

I used this library: http://connect2id.com/products/nimbus-jose-jwt Maven here: http://mvnrepository.com/artifact/com.nimbusds/nimbus-jose-jwt/2.10.1

  • 2
    Please, make sure you use the latest version. The library is being continuously reviewed & improved and new algorithms / features are being added: mvnrepository.com/artifact/com.nimbusds/nimbus-jose-jwt As of version 3.2 all standard JWS signature algorithms as fully supported as well as all JWE encryption algs, save for PBES2 and ECDH-ES. – Vladimir Dzhuvinov Nov 14 '14 at 11:18
  • Awesome. Thanks! – Marius Manastireanu Nov 14 '14 at 12:14
  • I used Jose and Nimbus and it worked well. – Cheeso Nov 22 '14 at 0:30
  • I am getting the following error: java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64 – Bear Jan 21 '15 at 9:32
  • 1
    In version 2.24 we switched from Apache Commons Codec to an internal utility to handle BASE64 encoding + decoding. With that the Android issue with the codec has been successfully resolved. See issue bitbucket.org/connect2id/nimbus-jose-jwt/issue/63 for more details. Plus you should get even better performance now :) – Vladimir Dzhuvinov Mar 12 '15 at 10:10

This library seems to work well: https://code.google.com/p/jsontoken/ .

It depends on Google Guava. Here are the Maven artifacts:


The library is in fact used by Google Wallet.


import java.security.InvalidKeyException;
import java.security.SignatureException;
import java.util.Calendar;
import java.util.List;

import net.oauth.jsontoken.JsonToken;
import net.oauth.jsontoken.JsonTokenParser;
import net.oauth.jsontoken.crypto.HmacSHA256Signer;
import net.oauth.jsontoken.crypto.HmacSHA256Verifier;
import net.oauth.jsontoken.crypto.SignatureAlgorithm;
import net.oauth.jsontoken.crypto.Verifier;
import net.oauth.jsontoken.discovery.VerifierProvider;
import net.oauth.jsontoken.discovery.VerifierProviders;

import org.apache.commons.lang3.StringUtils;
import org.bson.types.ObjectId;
import org.joda.time.DateTime;

import com.google.common.collect.Lists;
import com.google.gson.JsonObject;

 * @author davidm
public class AuthHelper {

    private static final String AUDIENCE = "NotReallyImportant";

    private static final String ISSUER = "YourCompanyOrAppNameHere";

    private static final String SIGNING_KEY = "LongAndHardToGuessValueWithSpecialCharacters@^($%*$%";

     * @param userId
     * @param durationDays
     * @return
    public static String createJsonWebToken(String userId, Long durationDays)    {
        //Current time and signing algorithm
        Calendar cal = Calendar.getInstance();
        HmacSHA256Signer signer;
        try {
        } catch (InvalidKeyException e) {
            throw new RuntimeException(e);

        //Configure JSON token
        JsonToken token = new net.oauth.jsontoken.JsonToken(signer);
        token.setIssuedAt(new org.joda.time.Instant(cal.getTimeInMillis()));

        //Configure request object, which provides information of the item
        JsonObject request = new JsonObject();
        request.addProperty("userId", userId);

        JsonObject payload = token.getPayloadAsJsonObject();
        payload.add("info", request);

        try {
            return token.serializeAndSign();
        } catch (SignatureException e) {
            throw new RuntimeException(e);

     * @param token
     * @return
     * @throws SignatureException
     * @throws InvalidKeyException
    public static TokenInfo verifyToken(String token)  
        try {
            final Verifier hmacVerifier = new HmacSHA256Verifier(SIGNING_KEY.getBytes());

            VerifierProvider hmacLocator = new VerifierProvider() {

                    return Lists.newArrayList(hmacVerifier);
            VerifierProviders locators = new VerifierProviders();
            locators.setVerifierProvider(SignatureAlgorithm.HS256, hmacLocator);
            net.oauth.jsontoken.Checker checker = new net.oauth.jsontoken.Checker(){

                public void check(JsonObject payload) throws SignatureException {
                    // don't throw - allow anything

            //Ignore Audience does not mean that the Signature is ignored
            JsonTokenParser parser = new JsonTokenParser(locators,
            JsonToken jt;
            try {
                jt = parser.verifyAndDeserialize(token);
            } catch (SignatureException e) {
                throw new RuntimeException(e);
            JsonObject payload = jt.getPayloadAsJsonObject();
            TokenInfo t = new TokenInfo();
                t.setUserId(new ObjectId(userIdString));
                return t;
                return null;
        } catch (InvalidKeyException e1) {
            throw new RuntimeException(e1);


public class TokenInfo {
    private ObjectId userId;
    private DateTime issued;
    private DateTime expires;
    public ObjectId getUserId() {
        return userId;
    public void setUserId(ObjectId userId) {
        this.userId = userId;
    public DateTime getIssued() {
        return issued;
    public void setIssued(DateTime issued) {
        this.issued = issued;
    public DateTime getExpires() {
        return expires;
    public void setExpires(DateTime expires) {
        this.expires = expires;

This is based on code here: https://developers.google.com/wallet/instant-buy/about-jwts And Here: https://code.google.com/p/wallet-online-sample-java/source/browse/src/com/google/wallet/online/jwt/util/WalletOnlineService.java?r=08b3333bd7260b20846d7d96d3cf15be8a128dfa

  • 3
    This library uses 1000s of dependencies, which all need to be resolved, compiled and make a big mess of your project. Why not primarily use what's available in Java? – Oliver Hausler Feb 12 '15 at 0:14
  • Not 1000s, it is less than 20s of dependencies , and work for me. – vanduc1102 Apr 17 '15 at 7:28
  • is this lib still active ?? – arvindwill Sep 9 '15 at 17:05
  • Unable to download the project. Getting a 401 – Val Martinez Oct 9 '17 at 15:53

By referring to https://jwt.io/ you can find jwt implementations in many languages including java. Also the site provide some comparison between these implementation (the algorithms they support and ....).

For java these are mentioned libraries:

  • Thanks, it helped me to find JWT plugin for my play framework app – chabeee Jun 21 '16 at 7:43
  • 1
    how do you guys choose which one to use? What if all 4 libraries cover all my use cases? – jkerak Sep 8 '16 at 17:38
  • 2
    @jkerak Go with whatever one seems simplest to you to implement. If all the implementations seem to be greek to you, go with the one with the coolest name. This has worked out well for me. – TheFunk Oct 18 '16 at 18:33

IETF has suggested jose libs on it's wiki: http://trac.tools.ietf.org/wg/jose/trac/wiki

I would highly recommend using them for signing. I am not a Java guy, but seems like jose4j seems like a good option. Has nice examples as well: https://bitbucket.org/b_c/jose4j/wiki/JWS%20Examples

Update: jwt.io provides a neat comparison of several jwt related libraries, and their features. A must check!

I would love to hear about what other java devs prefer.


I found this to be small and complete https://github.com/auth0/java-jwt


This page keeps references to implementations in various languages, including Java, and compares features: http://kjur.github.io/jsjws/index_mat.html



This is a fork of original google jsontoken

It has not been updated since Sep 11, 2012 and depends on some old packages.

What I have done:

Convert from Joda time to Java 8 time. So it requires Java 8.
Covert Json parser from Gson to Jackson as I don't want to include two Json parsers to my projects.
Remove google collections from dependency list as it is stopped long time ago.
Fix thread safe issue with Java Mac.doFinal call.

All existing unit tests passed along with some newly added test cases.

Here is a sample to generate token and verify the token. For more information, please check https://github.com/networknt/light source code for usage.

I am the author of both jsontoken and Omni-Channel Application Framework.


If you only need to parse unsigned unencrypted tokens you could use this code:

boolean parseJWT_2() {
    String authToken = getToken();
    String[] segments = authToken.split("\\.");
    String base64String = segments[1];
    int requiredLength = (int)(4 * Math.ceil(base64String.length() / 4.0));
    int nbrPaddings = requiredLength - base64String.length();

    if (nbrPaddings > 0) {
        base64String = base64String + "====".substring(0, nbrPaddings);

    base64String = base64String.replace("-", "+");
    base64String = base64String.replace("_", "/");

    try {
        byte[] data = Base64.decode(base64String, Base64.DEFAULT);

        String text;
        text = new String(data, "UTF-8");
        tokenInfo = new Gson().fromJson(text, TokenInfo.class);
    } catch (Exception e) {
        return false;

    return true;

Your Answer

