001 package com.nimbusds.jwt; 002 003 004 import java.text.ParseException; 005 006 import net.minidev.json.JSONObject; 007 008 import com.nimbusds.jose.Algorithm; 009 import com.nimbusds.jose.Header; 010 import com.nimbusds.jose.JOSEObject; 011 import com.nimbusds.jose.JWEAlgorithm; 012 import com.nimbusds.jose.JWSAlgorithm; 013 import com.nimbusds.jose.util.Base64URL; 014 import com.nimbusds.jose.util.JSONObjectUtils; 015 016 017 /** 018 * Parser for plain, signed and encrypted JSON Web Tokens (JWTs). 019 * 020 * @author Vladimir Dzhuvinov 021 * @version $version$ (2012-09-28) 022 */ 023 public final class JWTParser { 024 025 026 /** 027 * Parses a plain, signed or encrypted JSON Web Token (JWT) from the 028 * specified string in compact format. 029 * 030 * @param s The string to parse. Must not be {@code null}. 031 * 032 * @return The corresponding {@link PlainJWT}, {@link SignedJWT} or 033 * {@link EncryptedJWT} instance. 034 * 035 * @throws ParseException If the string couldn't be parsed to a valid 036 * plain, signed or encrypted JWT. 037 */ 038 public static JWT parse(final String s) 039 throws ParseException { 040 041 Base64URL[] parts = JOSEObject.split(s); 042 043 JSONObject jsonObject = null; 044 045 try { 046 jsonObject = JSONObjectUtils.parseJSONObject(parts[0].decodeToString()); 047 048 } catch (ParseException e) { 049 050 throw new ParseException("Invalid plain/JWS/JWE header: " + e.getMessage(), 0); 051 } 052 053 Algorithm alg = Header.parseAlgorithm(jsonObject); 054 055 if (alg.equals(Algorithm.NONE)) { 056 return PlainJWT.parse(s); 057 } else if (alg instanceof JWSAlgorithm) { 058 return SignedJWT.parse(s); 059 } else if (alg instanceof JWEAlgorithm) { 060 return EncryptedJWT.parse(s); 061 } else { 062 throw new AssertionError("Unexpected algorithm type: " + alg); 063 } 064 } 065 066 067 /** 068 * Prevents instantiation. 069 */ 070 private JWTParser() { 071 072 // Nothing to do 073 } 074 }