title: Java 8 Base64 JWT token into JSON
body: <p>So, I have done some research on this on the Net and here on StackOverflow, and I have tried many, multiple suggestions that I have found.  The problem is that I am logging into one of our Oauth2 services which is working well.   I get an Oath2 JWT token.   I know this is Base64 encoded, and I can drop the token into jwt.io and www.base64decode.org and both of these sites parse the token correctly.</p>
  
  <p>I am using Java 8 Base64 tools, and the code looks as follows:</p>
  
  <pre><code>public String getTokenProperty(String token, String propertyName)
  {
      byte[] bytes = Base64.getUrlDecoder().decode(token);
      String decodedString = new String(bytes, StandardCharsets.UTF_8);
      System.out.println("Decoded: " + decodedString);
      return (new JSONObject(decodedString)).getString(propertyName);
  }
  </code></pre>
  
  <p>The error occurs on the decoder line as follows:</p>
  
  <pre><code>java.lang.IllegalArgumentException: Illegal base64 character 2e
  </code></pre>
  
  <p>I tried this with a token from my Oauth2 Service, I got a token from Syncope, and I got a token from Auth0 ... all return with JWT Base64 encoded tokens.
  With ALL these tokens from these different servers, I get the same error.</p>
  
  <p>I would like to use the Java 8 Base64 which is standard, but I am thinking that I may need to use an external third-party Base64 decoder.</p>
  
  <p>Any help would be great.   Thanks!</p>
  
  <p>The token is as follows:</p>
  
  <pre><code>eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik1qSTRRVFEwT1VRNU9VSXlSVEV6TlRBd05UVXpSVVExTlVOR05FVkVORGRDTlRnM016VXdRZyJ9.eyJodHRwczovL2JpdG9vbXRyYWRlci5uZXQvYXV0aG9yaXphdGlvbiI6eyJncm91cHMiOlsiQ29uc3VtZXJzIl0sInJvbGVzIjpbIlVzZXIiXX0sImlzcyI6Imh0dHBzOi8vYml0em9vbS5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NWNhNTE5NzZjYzMzZjUxMTBhYWNkYmM0IiwiYXVkIjpbImh0dHBzOi8vYml0em9vbS5hdXRoMC5jb20vYXBpL3YyLyIsImh0dHBzOi8vYml0em9vbS5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNTU5MzIzNDI1LCJleHAiOjE1NTk0MDk4MjUsImF6cCI6IlliRGFSelRVQkFtZEFrSExqdjZ0bEI3U05xSTF1RlNtIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCBhZGRyZXNzIHBob25lIHJlYWQ6Y3VycmVudF91c2VyIHVwZGF0ZTpjdXJyZW50X3VzZXJfbWV0YWRhdGEgZGVsZXRlOmN1cnJlbnRfdXNlcl9tZXRhZGF0YSBjcmVhdGU6Y3VycmVudF91c2VyX21ldGFkYXRhIGNyZWF0ZTpjdXJyZW50X3VzZXJfZGV2aWNlX2NyZWRlbnRpYWxzIGRlbGV0ZTpjdXJyZW50X3VzZXJfZGV2aWNlX2NyZWRlbnRpYWxzIHVwZGF0ZTpjdXJyZW50X3VzZXJfaWRlbnRpdGllcyIsImd0eSI6InBhc3N3b3JkIn0.St7097L1ZAlBWcAPrie-8CGV2F3Fr8uNYpSDVKSPVPF4zBZrmm62_UAj7Ssux8AjUy0LhjiF3kLpNph2L7yrpUREw6TyGJwQasfdVtM5VzRYUcy-fOGyRSqPQorbzxJQZzs2pyDJm-2hMQ0McJ37ubKIWrHFD5McMedN6THK7g5TExX47XCRPcOuCEWm3bf3zdWF2LEGhCw_c-lcZDwlb4ePkO721XjSWtrXEBvxc8scFNaHDt7VOnrSze4XK_LO8eE8bHRq6qUrWf1csYucK--aHazBsvfdl-6QDRk-tOBM-LdXJMT7H8Ih6trxVmZofQjr2dQ4j_3DTVoU3eLdog
  </code></pre>
  
  <p>UPDATE:</p>
  
  <p>I switched from java,util.Base64 to org.apache.commons.codec.binary.Base64
  and this seems to work somewhat, I don't get an error now.   </p>
  
  <pre><code>String decodedString = new String(bytes, StandardCharsets.UTF_8);
  </code></pre>
  
  <p>gives me back a string of the header, payload, and signature data.  So, when I do:</p>
  
  <pre><code>JSONObject jsonObject = new JSONObject(decodedString);
      System.out.println("getTokenProperty: jsonObject = " + jsonObject.toString());
  </code></pre>
  
  <p>I am only getting back the header data, and what I really need is the payload.</p>
  
  <p>For the record ... the code I inherited from a "proof of concept" project was:</p>
  
  <pre><code>public static String getTokenProperty(String token, String propertyName)
  {
      return (new JSONObject(new String(Base64.getDecoder().decode(token)))).getString(propertyName);
  }
  </code></pre>
  
  <p>and there was no unit testing at all.  So, when I went to unit test it, of course it completely broke.   So, now I have a better understanding of how to parse this token, and I will remember this lesson for a long time.</p>
  
  <p>Thanks very much!</p>