You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oltu.apache.org by si...@apache.org on 2013/09/17 19:35:48 UTC

svn commit: r1524138 - in /oltu/trunk/oauth-2.0/jwt/src: main/java/org/apache/oltu/oauth2/jwt/ main/java/org/apache/oltu/oauth2/jwt/io/ test/java/org/apache/oltu/oauth2/jwt/ test/java/org/apache/oltu/oauth2/jwt/io/

Author: simonetripodi
Date: Tue Sep 17 17:35:47 2013
New Revision: 1524138

URL: http://svn.apache.org/r1524138
Log:
[OLTU-117] Replace JWTUtils with JWT(Reader|Writer)

Added:
    oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/
    oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/AbstractJWTIO.java   (with props)
    oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTReader.java   (with props)
    oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTWriter.java   (with props)
    oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/package-info.java   (with props)
    oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/
    oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/IOTestCaseConstants.java   (with props)
    oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTReaderTestCase.java   (with props)
    oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTWriterTestCase.java   (with props)
Removed:
    oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/JWTUtils.java
    oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/JWTUtilsTest.java
Modified:
    oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/JWTEntity.java

Modified: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/JWTEntity.java
URL: http://svn.apache.org/viewvc/oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/JWTEntity.java?rev=1524138&r1=1524137&r2=1524138&view=diff
==============================================================================
--- oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/JWTEntity.java (original)
+++ oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/JWTEntity.java Tue Sep 17 17:35:47 2013
@@ -24,7 +24,7 @@ import java.util.Set;
 /**
  * Abstract representation of a JWT entity which can contain custom fields.
  */
-abstract class JWTEntity {
+public abstract class JWTEntity {
 
     /**
      * The registry that keeps the custom fields.

Added: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/AbstractJWTIO.java
URL: http://svn.apache.org/viewvc/oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/AbstractJWTIO.java?rev=1524138&view=auto
==============================================================================
--- oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/AbstractJWTIO.java (added)
+++ oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/AbstractJWTIO.java Tue Sep 17 17:35:47 2013
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.oltu.oauth2.jwt.io;
+
+import java.nio.charset.Charset;
+
+import org.apache.commons.codec.binary.Base64;
+
+abstract class AbstractJWTIO {
+
+    /**
+     * The {@code UTF-8} charset reference.
+     */
+    protected static final Charset UTF_8 = Charset.forName("UTF-8");
+
+    // header defined in the JWT specification
+
+    /**
+     * The {@code typ} JWT Header key.
+     */
+    protected static final String TYPE = "typ";
+
+    /**
+     * The {@code alg} JWT Header key.
+     */
+    public static final String ALGORITHM = "alg";
+
+    /**
+     * The {@code cty} JWT Header key.
+     */
+    public static final String CONTENT_TYPE = "cty";
+
+    // reserved claims defined in the JWT specification
+
+    /**
+     * The {@code iss} JWT Claims Set key.
+     */
+    protected static final String ISSUER = "iss";
+
+    /**
+     * The {@code sub} JWT Claims Set key.
+     */
+    protected static final String SUBJECT = "sub";
+
+    /**
+     * The {@code aud} JWT Claims Set key.
+     */
+    protected static final String AUDIENCE = "aud";
+
+    /**
+     * The {@code exp} JWT Claims Set key.
+     */
+    protected static final String EXPIRATION_TIME = "exp";
+
+    /**
+     * The {@code nbf} JWT Claims Set key.
+     */
+    protected static final String NOT_BEFORE = "nbf";
+
+    /**
+     * The {@code iat} JWT Claims Set key.
+     */
+    protected static final String ISSUED_AT = "iat";
+
+    /**
+     * The {@code jti} JWT Claims Set key.
+     */
+    protected static final String JWT_ID = "jti";
+
+    /**
+     * The BASE64 encoder/decoder.
+     */
+    protected final Base64 base64 = new Base64(true);
+
+}

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/AbstractJWTIO.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/AbstractJWTIO.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/AbstractJWTIO.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTReader.java
URL: http://svn.apache.org/viewvc/oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTReader.java?rev=1524138&view=auto
==============================================================================
--- oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTReader.java (added)
+++ oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTReader.java Tue Sep 17 17:35:47 2013
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.oltu.oauth2.jwt.io;
+
+import static java.lang.String.format;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Iterator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.oltu.oauth2.jwt.JWT;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+
+/**
+ * A {@link JWT} reader.
+ */
+public final class JWTReader extends AbstractJWTIO {
+
+    /**
+     * The Base64 JSON string default separator.
+     */
+    private static final Pattern BASE64_JWT_PATTERN = Pattern.compile("([a-zA-Z0-9/+=]+)\\.([a-zA-Z0-9/+=]+)\\.(.+)");
+
+    /**
+     * Parses a Base64 encoded JSON Web Token.
+     *
+     * @param base64jsonString a Base64 encoded JSON Web Token.
+     * @return a JWT instance.
+     */
+    @SuppressWarnings("unchecked") // it is known that JSON keys are strings
+    public JWT read(String base64jsonString) {
+        if (base64jsonString == null || base64jsonString.isEmpty()) {
+            throw new IllegalArgumentException("Impossible to obtain a JWT from a null or empty string");
+        }
+
+        // TODO improve multi-line tokens
+        StringBuilder buffer = new StringBuilder();
+        BufferedReader reader = new BufferedReader(new StringReader(base64jsonString));
+        String line = null;
+        try {
+            while ((line = reader.readLine()) != null) {
+                buffer.append(line);
+            }
+        } catch (IOException e) {
+            // it cannot happen
+        } finally {
+            try {
+                reader.close();
+            } catch (IOException e) {
+                // swallow it
+            }
+        }
+
+        Matcher matcher = BASE64_JWT_PATTERN.matcher(buffer.toString());
+        if (!matcher.matches()) {
+            throw new IllegalArgumentException(base64jsonString
+                                               + "is not a valid JSON Web Token, it does not match with the pattern: "
+                                               + BASE64_JWT_PATTERN.pattern());
+        }
+
+        JWT.Builder jwtBuilder = new JWT.Builder(base64jsonString);
+
+        String header = matcher.group(1);
+        JSONObject headerObject = decodeJSON(header);
+
+        for (Iterator<String> keys = headerObject.keys(); keys.hasNext();) {
+            String key = keys.next();
+
+            if (ALGORITHM.equals(key)) {
+                jwtBuilder.setHeaderAlgorithm(getString(headerObject, ALGORITHM));
+            } else if (TYPE.equals(key)) {
+                jwtBuilder.setHeaderType(getString(headerObject, TYPE));
+            } else if (CONTENT_TYPE.equals(key)) {
+                jwtBuilder.setHeaderContentType(getString(headerObject, CONTENT_TYPE));
+            } else {
+                jwtBuilder.setHeaderCustomField(key, getString(headerObject, key));
+            }
+        }
+
+        String claimsSet = matcher.group(2);
+        JSONObject claimsSetObject = decodeJSON(claimsSet);
+
+        for (Iterator<String> keys = claimsSetObject.keys(); keys.hasNext();) {
+            String key = keys.next();
+
+            if (AUDIENCE.equals(key)) {
+                jwtBuilder.setClaimsSetAudience(getString(claimsSetObject, AUDIENCE));
+            } else if (EXPIRATION_TIME.equals(key)) {
+                jwtBuilder.setClaimsSetExpirationTime(getLong(claimsSetObject, EXPIRATION_TIME));
+            } else if (ISSUED_AT.equals(key)) {
+                jwtBuilder.setClaimsSetIssuedAt(getLong(claimsSetObject, ISSUED_AT));
+            } else if (ISSUER.equals(key)) {
+                jwtBuilder.setClaimsSetIssuer(getString(claimsSetObject, ISSUER));
+            } else if (JWT_ID.equals(key)) {
+                jwtBuilder.setClaimsSetJwdId(getString(claimsSetObject, JWT_ID));
+            } else if (NOT_BEFORE.equals(key)) {
+                jwtBuilder.setClaimsSetNotBefore(getString(claimsSetObject, NOT_BEFORE));
+            } else if (SUBJECT.equals(key)) {
+                jwtBuilder.setClaimsSetSubject(getString(claimsSetObject, SUBJECT));
+            } else if (TYPE.equals(key)) {
+                jwtBuilder.setClaimsSetType(getString(claimsSetObject, TYPE));
+            } else {
+                jwtBuilder.setClaimsSetCustomField(key, getString(claimsSetObject, key));
+            }
+        }
+
+        String signature = matcher.group(3);
+
+        return jwtBuilder.setSignature(signature).build();
+    }
+
+    private JSONObject decodeJSON(String base64jsonString) {
+        String decodedJsonString = new String(base64.decode(base64jsonString), UTF_8);
+
+        try {
+            return new JSONObject(decodedJsonString);
+        } catch (JSONException e) {
+            throw new IllegalArgumentException(format("BASE64 string '%s' (decoded to '%s') is not a valid JSON object representation",
+                                                      base64jsonString, decodedJsonString));
+        }
+    }
+
+    private static String getString(JSONObject object, String key) {
+        try {
+            return object.getString(key);
+        } catch (JSONException e) {
+            return null;
+        }
+    }
+
+    private static long getLong(JSONObject object, String key) {
+        try {
+            return object.getLong(key);
+        } catch (JSONException e) {
+            return 0;
+        }
+    }
+
+}

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTReader.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTReader.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTWriter.java
URL: http://svn.apache.org/viewvc/oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTWriter.java?rev=1524138&view=auto
==============================================================================
--- oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTWriter.java (added)
+++ oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTWriter.java Tue Sep 17 17:35:47 2013
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.oltu.oauth2.jwt.io;
+
+import java.io.StringWriter;
+import java.util.Map.Entry;
+
+import org.apache.oltu.oauth2.jwt.ClaimsSet;
+import org.apache.oltu.oauth2.jwt.Header;
+import org.apache.oltu.oauth2.jwt.JWT;
+import org.apache.oltu.oauth2.jwt.JWTEntity;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+
+/**
+ * A {@link JWT} writer.
+ */
+public final class JWTWriter extends AbstractJWTIO {
+
+    public String write(JWT jwt) {
+        if (jwt == null) {
+            throw new IllegalArgumentException("Impossible to build a Token from a null JWT representation.");
+        }
+
+        String header = toJsonString(jwt.getHeader());
+        String encodedHeader = encodeJson(header);
+
+        String claimsSet = toJsonString(jwt.getClaimsSet());
+        String encodedClaimsSet = encodeJson(claimsSet);
+
+        String signature = jwt.getSignature();
+        if (signature == null) {
+            signature = "";
+        }
+
+        return new StringBuilder()
+               .append(encodedHeader)
+               .append('.')
+               .append('\r')
+               .append('\n')
+               .append(encodedClaimsSet)
+               .append('.')
+               .append('\r')
+               .append('\n')
+               .append(signature)
+               .toString();
+    }
+
+    /**
+     * Serializes the input JWT Header to its correct JSON representation.
+     *
+     * @param header the JWT Header has to be serialized.
+     * @return the JSON string that represents the JWT Header.
+     */
+    private static String toJsonString(Header header) {
+        if (header == null) {
+            throw new IllegalArgumentException("Null JWT Header cannot be serialized to JSON representation.");
+        }
+
+        JSONObject object = new JSONObject();
+        setString(object, ALGORITHM, header.getAlgorithm());
+        setString(object, CONTENT_TYPE, header.getContentType());
+        setString(object, TYPE, header.getType());
+        return toJsonString(header, object);
+    }
+
+    /**
+     * Serializes the input JWT Claims Set to its correct JSON representation.
+     *
+     * @param claimsSet the JWT Claims Set has to be serialized.
+     * @return the JSON string that represents the JWT Claims Set.
+     */
+    private static String toJsonString(ClaimsSet claimsSet) {
+        if (claimsSet == null) {
+            throw new IllegalArgumentException("Null JWT Claims Set cannot be serialized to JSON representation.");
+        }
+
+        JSONObject object = new JSONObject();
+        setString(object, AUDIENCE, claimsSet.getAudience());
+        setString(object, ISSUER, claimsSet.getIssuer());
+        setString(object, JWT_ID, claimsSet.getJwdId());
+        setString(object, NOT_BEFORE, claimsSet.getNotBefore());
+        setString(object, SUBJECT, claimsSet.getSubject());
+        setString(object, TYPE, claimsSet.getType());
+        setLong(object, EXPIRATION_TIME, claimsSet.getExpirationTime());
+        setLong(object, ISSUED_AT, claimsSet.getIssuedAt());
+        return toJsonString(claimsSet, object);
+    }
+
+    private static String toJsonString(JWTEntity entity, JSONObject object) {
+        for (Entry<String, Object> customField : entity.getCustomFields()) {
+            setObject(object, customField.getKey(), customField.getValue());
+        }
+
+        StringWriter writer = new StringWriter();
+        try {
+            object.write(writer);
+        } catch (JSONException e) {
+            // swallow it, it should be safe enough to write to a StringWriter
+        }
+        return writer.toString();
+    }
+
+    private String encodeJson(String jsonString) {
+        return new String(base64.encode(jsonString.getBytes(UTF_8)), UTF_8);
+    }
+
+    private static void setString(JSONObject object, String key, String value) {
+        if (value != null) {
+            try {
+                object.put(key, value);
+            } catch (JSONException e) {
+                // swallow it, null values are already guarded
+            }
+        }
+    }
+
+    private static void setLong(JSONObject object, String key, long value) {
+        if (value != 0) {
+            try {
+                object.put(key, value);
+            } catch (JSONException e) {
+                // swallow it, null values are already guarded
+            }
+        }
+    }
+
+    private static void setObject(JSONObject object, String key, Object value) {
+        if (value != null) {
+            try {
+                object.put(key, value);
+            } catch (JSONException e) {
+                // swallow it, null values are already guarded
+            }
+        }
+    }
+
+}

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTWriter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTWriter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/JWTWriter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/package-info.java
URL: http://svn.apache.org/viewvc/oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/package-info.java?rev=1524138&view=auto
==============================================================================
--- oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/package-info.java (added)
+++ oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/package-info.java Tue Sep 17 17:35:47 2013
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * JWT I/O manipulators implementation.
+ */
+package org.apache.oltu.oauth2.jwt.io;

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: oltu/trunk/oauth-2.0/jwt/src/main/java/org/apache/oltu/oauth2/jwt/io/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/IOTestCaseConstants.java
URL: http://svn.apache.org/viewvc/oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/IOTestCaseConstants.java?rev=1524138&view=auto
==============================================================================
--- oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/IOTestCaseConstants.java (added)
+++ oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/IOTestCaseConstants.java Tue Sep 17 17:35:47 2013
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.oltu.oauth2.jwt.io;
+
+interface IOTestCaseConstants {
+
+    public final String JWT = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImJlMWRhMGIzNTY3YmQyNjVhMjUwOThmYmNjMmIwOWYyMTM0\r\n"
+                            + "NWIzYTIifQ\r\n"
+                            + ".\r\n"
+                            + "eyJhdWQiOiI3ODg3MzIzNzIwNzguYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJpc3MiOiJh\r\n"
+                            + "Y2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTA2NDIyNDUzMDgyNDc5OTk4NDI5IiwiZXhwIjox\r\n"
+                            + "MzY2NzMwMjE3LCJpYXQiOjEzNjY3MjYzMTcsImlkIjoiMTA2NDIyNDUzMDgyNDc5OTk4NDI5Iiwi\r\n"
+                            + "dmVyaWZpZWRfZW1haWwiOiJ0cnVlIiwiZW1haWxfdmVyaWZpZWQiOiJ0cnVlIiwiY2lkIjoiNzg4\r\n"
+                            + "NzMyMzcyMDc4LmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXpwIjoiNzg4NzMyMzcyMDc4\r\n"
+                            + "LmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiZW1haWwiOiJhbnRvbmlvLnNhbnNvQGdtYWls\r\n"
+                            + "LmNvbSIsInRva2VuX2hhc2giOiJMMkk3N2dpQkxrMFJTczB6UTFTdkNBIiwiYXRfaGFzaCI6Ikwy\r\n"
+                            + "STc3Z2lCTGswUlNzMHpRMVN2Q0EifQ\r\n"
+                            + ".\r\n"
+                            + "XWYi5Zj1YWAMGIml_ftoAwmvW1Y7oeybLCpzQrJVuWJpS8L8Vd2TL-RTIOEVG03VA7e0_-_frNuw7MxUgVEgh8G-Nnbk_baJ6k_3w5c1SKFamFiHHDoKLFhrt1Y8JKSuGwE02V-px4Cn0dRAQAc1IN5CU6wqCrYK0p-fv_fvy28";
+
+}

Propchange: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/IOTestCaseConstants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/IOTestCaseConstants.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/IOTestCaseConstants.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTReaderTestCase.java
URL: http://svn.apache.org/viewvc/oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTReaderTestCase.java?rev=1524138&view=auto
==============================================================================
--- oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTReaderTestCase.java (added)
+++ oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTReaderTestCase.java Tue Sep 17 17:35:47 2013
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.oltu.oauth2.jwt.io;
+
+import static junit.framework.Assert.assertEquals;
+
+import org.apache.oltu.oauth2.jwt.ClaimsSet;
+import org.apache.oltu.oauth2.jwt.Header;
+import org.apache.oltu.oauth2.jwt.JWT;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public final class JWTReaderTestCase implements IOTestCaseConstants {
+
+    private JWT jwt;
+
+    private final JWTReader jwtReader = new JWTReader();
+
+    @Before
+    public void setUp() throws Exception {
+        jwt = jwtReader.read(JWT);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        jwt = null;
+    }
+
+    @Test
+    public void testJWT() throws Exception {
+        assertEquals(JWT, jwt.getRawString());
+    }
+
+    @Test
+    public void testHeader() throws Exception {
+        Header header = jwt.getHeader();
+        assertEquals("RS256", header.getAlgorithm());
+    }
+
+    @Test
+    public void testClaimsSet() throws Exception {
+        ClaimsSet claimsSet = jwt.getClaimsSet();
+        assertEquals("788732372078.apps.googleusercontent.com", claimsSet.getAudience());
+        assertEquals("accounts.google.com", claimsSet.getIssuer());
+        assertEquals("106422453082479998429", claimsSet.getSubject());
+        assertEquals(1366730217, claimsSet.getExpirationTime());
+        assertEquals(1366726317, claimsSet.getIssuedAt());
+    }
+
+}

Propchange: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTReaderTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTReaderTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTReaderTestCase.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTWriterTestCase.java
URL: http://svn.apache.org/viewvc/oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTWriterTestCase.java?rev=1524138&view=auto
==============================================================================
--- oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTWriterTestCase.java (added)
+++ oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTWriterTestCase.java Tue Sep 17 17:35:47 2013
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.oltu.oauth2.jwt.io;
+
+import static junit.framework.Assert.assertEquals;
+
+import org.apache.oltu.oauth2.jwt.JWT;
+import org.junit.Test;
+
+public final class JWTWriterTestCase implements IOTestCaseConstants {
+
+    @Test
+    public void write() {
+        JWT jwt = new JWT.Builder()
+                          // header
+                          .setHeaderAlgorithm("RS256")
+                          .setHeaderCustomField("kid", "be1da0b3567bd265a25098fbcc2b09f21345b3a2")
+                          // claimset
+                          .setClaimsSetAudience("788732372078.apps.googleusercontent.com")
+                          .setClaimsSetIssuer("accounts.google.com")
+                          .setClaimsSetSubject("106422453082479998429")
+                          .setClaimsSetExpirationTime(1366730217)
+                          .setClaimsSetIssuedAt(1366726317)
+                          .setClaimsSetCustomField("id", "106422453082479998429")
+                          .setClaimsSetCustomField("verified_email", "true")
+                          .setClaimsSetCustomField("email_verified", "true")
+                          .setClaimsSetCustomField("cid", "788732372078.apps.googleusercontent.com")
+                          .setClaimsSetCustomField("azp", "788732372078.apps.googleusercontent.com")
+                          .setClaimsSetCustomField("email", "antonio.sanso@gmail.com")
+                          .setClaimsSetCustomField("token_hash", "L2I77giBLk0RSs0zQ1SvCA")
+                          .setClaimsSetCustomField("at_hash", "L2I77giBLk0RSs0zQ1SvCA")
+                          // signature
+                          .setSignature("XWYi5Zj1YWAMGIml_ftoAwmvW1Y7oeybLCpzQrJVuWJpS8L8Vd2TL-RTIOEVG03VA7e0_-_frNuw7MxUgVEgh8G-Nnbk_baJ6k_3w5c1SKFamFiHHDoKLFhrt1Y8JKSuGwE02V-px4Cn0dRAQAc1IN5CU6wqCrYK0p-fv_fvy28")
+                          .build();
+        String encodedJWT = new JWTWriter().write(jwt);
+        assertEquals(JWT, encodedJWT);
+    }
+
+}

Propchange: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTWriterTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTWriterTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: oltu/trunk/oauth-2.0/jwt/src/test/java/org/apache/oltu/oauth2/jwt/io/JWTWriterTestCase.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain