/** Decrypt and verify the provided security token. */
 @Override
 public SecurityToken createToken(Map<String, String> tokenParameters)
     throws SecurityTokenException {
   String token = tokenParameters.get(SecurityTokenCodec.SECURITY_TOKEN_NAME);
   if (token == null || token.trim().length() == 0) {
     // No token is present, assume anonymous access
     return new AnonymousSecurityToken();
   }
   String[] fields = token.split(":");
   if (fields.length != 2) {
     throw new SecurityTokenException("Invalid security token " + token);
   }
   String container = fields[0];
   BlobCrypter crypter = crypters.get(container);
   if (crypter == null) {
     throw new SecurityTokenException("Unknown container " + token);
   }
   String domain = domains.get(container);
   String activeUrl = tokenParameters.get(SecurityTokenCodec.ACTIVE_URL_NAME);
   String crypted = fields[1];
   try {
     return ExoBlobCrypterSecurityToken.decrypt(crypter, container, domain, crypted, activeUrl);
   } catch (BlobCrypterException e) {
     throw new SecurityTokenException(e);
   }
 }