/* * oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. * * Copyright (c) 2014, Gluu */ package org.xdi.oxauth.model.token; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xdi.oxauth.model.common.AccessToken; import org.xdi.oxauth.model.common.AuthorizationGrantType; import org.xdi.oxauth.model.common.IdToken; import org.xdi.oxauth.model.common.RefreshToken; import org.xdi.oxauth.model.util.Util; /** * @author Javier Rojas Blum Date: 05.22.2012 */ public class PersistentJwt { private final static Logger log = LoggerFactory.getLogger(PersistentJwt.class); private String userId; private String clientId; private AuthorizationGrantType authorizationGrantType; private Date authenticationTime; private List<String> scopes; private List<AccessToken> accessTokens; private List<RefreshToken> refreshTokens; private AccessToken longLivedAccessToken; private IdToken idToken; public PersistentJwt() { } public PersistentJwt(String jwt) { try { load(jwt); } catch (JSONException e) { log.error(e.getMessage(), e); } } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getClientId() { return clientId; } public void setClientId(String clientId) { this.clientId = clientId; } public AuthorizationGrantType getAuthorizationGrantType() { return authorizationGrantType; } public void setAuthorizationGrantType(AuthorizationGrantType authorizationGrantType) { this.authorizationGrantType = authorizationGrantType; } public Date getAuthenticationTime() { return authenticationTime; } public List<String> getScopes() { return scopes; } public void setScopes(List<String> scopes) { this.scopes = scopes; } public void setAuthenticationTime(Date authenticationTime) { this.authenticationTime = authenticationTime; } public List<AccessToken> getAccessTokens() { return accessTokens; } public void setAccessTokens(List<AccessToken> accessTokens) { this.accessTokens = accessTokens; } public List<RefreshToken> getRefreshTokens() { return refreshTokens; } public void setRefreshTokens(List<RefreshToken> refreshTokens) { this.refreshTokens = refreshTokens; } public AccessToken getLongLivedAccessToken() { return longLivedAccessToken; } public void setLongLivedAccessToken(AccessToken longLivedAccessToken) { this.longLivedAccessToken = longLivedAccessToken; } public IdToken getIdToken() { return idToken; } public void setIdToken(IdToken idToken) { this.idToken = idToken; } @Override public String toString() { JSONObject jsonObject = new JSONObject(); try { if (StringUtils.isNotBlank(userId)) { jsonObject.put("user_id", userId); } if (StringUtils.isNotBlank(clientId)) { jsonObject.put("client_id", clientId); } if (authorizationGrantType != null) { jsonObject.put("authorization_grant_type", authorizationGrantType); } if (authenticationTime != null) { jsonObject.put("authentication_time", authenticationTime.getTime()); } if (scopes != null) { JSONArray scopesJsonArray = new JSONArray(); for (String scope : scopes) { scopesJsonArray.put(scope); } jsonObject.put("scopes", scopesJsonArray); } if (accessTokens != null) { JSONArray accessTokensJsonArray = new JSONArray(); for (AccessToken accessToken : accessTokens) { JSONObject accessTokenJsonObject = new JSONObject(); if (accessToken.getCode() != null && !accessToken.getCode().isEmpty()) { accessTokenJsonObject.put("code", accessToken.getCode()); } if (accessToken.getCreationDate() != null) { accessTokenJsonObject.put("creation_date", accessToken.getCreationDate().getTime()); } if (accessToken.getExpirationDate() != null) { accessTokenJsonObject.put("expiration_date", accessToken.getExpirationDate().getTime()); } accessTokensJsonArray.put(accessTokenJsonObject); } jsonObject.put("access_tokens", accessTokensJsonArray); } if (refreshTokens != null) { JSONArray refreshTokensJsonArray = new JSONArray(); for (RefreshToken refreshToken : refreshTokens) { JSONObject refreshTokenJsonObject = new JSONObject(); if (refreshToken.getCode() != null && !refreshToken.getCode().isEmpty()) { refreshTokenJsonObject.put("code", refreshToken.getCode()); } if (refreshToken.getCreationDate() != null) { refreshTokenJsonObject.put("creation_date", refreshToken.getCreationDate().getTime()); } if (refreshToken.getExpirationDate() != null) { refreshTokenJsonObject.put("expiration_date", refreshToken.getExpirationDate().getTime()); } } jsonObject.put("refresh_tokens", refreshTokensJsonArray); } if (longLivedAccessToken != null) { JSONObject longLivedAccessTokenJsonObject = new JSONObject(); if (longLivedAccessToken.getCode() != null && !longLivedAccessToken.getCode().isEmpty()) { longLivedAccessTokenJsonObject.put("code", longLivedAccessToken.getCode()); } if (longLivedAccessToken.getCreationDate() != null) { longLivedAccessTokenJsonObject.put("creation_date", longLivedAccessToken.getCreationDate().getTime()); } if (longLivedAccessToken.getExpirationDate() != null) { longLivedAccessTokenJsonObject.put("expiration_date", longLivedAccessToken.getExpirationDate().getTime()); } jsonObject.put("long_lived_access_token", longLivedAccessTokenJsonObject); } if (idToken != null) { JSONObject idTokenJsonObject = new JSONObject(); if (idToken.getCode() != null && !idToken.getCode().isEmpty()) { idTokenJsonObject.put("code", idToken.getCode()); } if (idToken.getCreationDate() != null) { idTokenJsonObject.put("creation_date", idToken.getCreationDate().getTime()); } if (idToken.getExpirationDate() != null) { idTokenJsonObject.put("expiration_date", idToken.getExpirationDate().getTime()); } jsonObject.put("id_token", idTokenJsonObject); } } catch (JSONException e) { log.error(e.getMessage(), e); } return jsonObject.toString(); } private boolean load(String jwt) throws JSONException { boolean result = false; JSONObject jsonObject = new JSONObject(jwt); if (jsonObject.has("user_id")) { userId = jsonObject.getString("user_id"); } if (jsonObject.has("client_id")) { clientId = jsonObject.getString("client_id"); } if (jsonObject.has("authorization_grant_type")) { authorizationGrantType = AuthorizationGrantType.fromString(jsonObject.getString("authorization_grant_type")); } if (jsonObject.has("authentication_time")) { authenticationTime = new Date(jsonObject.getLong("authentication_time")); } if (jsonObject.has("scopes")) { JSONArray jsonArray = jsonObject.getJSONArray("scopes"); scopes = Util.asList(jsonArray); } if (jsonObject.has("access_tokens")) { JSONArray accessTokensJsonArray = jsonObject.getJSONArray("access_tokens"); accessTokens = new ArrayList<AccessToken>(); for (int i = 0; i < accessTokensJsonArray.length(); i++) { JSONObject accessTokenJsonObject = accessTokensJsonArray.getJSONObject(i); if (accessTokenJsonObject.has("code") && accessTokenJsonObject.has("creation_date") && accessTokenJsonObject.has("expiration_date")) { String tokenCode = accessTokenJsonObject.getString("code"); Date creationDate = new Date(accessTokenJsonObject.getLong("creation_date")); Date expirationDate = new Date(accessTokenJsonObject.getLong("expiration_date")); AccessToken accessToken = new AccessToken(tokenCode, creationDate, expirationDate); accessTokens.add(accessToken); } } } if (jsonObject.has("refresh_tokens")) { JSONArray refreshTokensJsonArray = jsonObject.getJSONArray("refresh_tokens"); refreshTokens = new ArrayList<RefreshToken>(); for (int i = 0; i < refreshTokensJsonArray.length(); i++) { JSONObject refreshTokenJsonObject = refreshTokensJsonArray.getJSONObject(i); if (refreshTokenJsonObject.has("code") && refreshTokenJsonObject.has("creation_date") && refreshTokenJsonObject.has("expiration_date")) { String tokenCode = refreshTokenJsonObject.getString("code"); Date creationDate = new Date(refreshTokenJsonObject.getLong("creation_date")); Date expirationDate = new Date(refreshTokenJsonObject.getLong("expiration_date")); RefreshToken refreshToken = new RefreshToken(tokenCode, creationDate, expirationDate); refreshTokens.add(refreshToken); } } } if (jsonObject.has("long_lived_access_token")) { JSONObject longLivedAccessTokenJsonObject = jsonObject.getJSONObject("long_lived_access_token"); if (longLivedAccessTokenJsonObject.has("code") && longLivedAccessTokenJsonObject.has("creation_date") && longLivedAccessTokenJsonObject.has("expiration_date")) { String tokenCode = longLivedAccessTokenJsonObject.getString("code"); Date creationDate = new Date(longLivedAccessTokenJsonObject.getLong("creation_date")); Date expirationDate = new Date(longLivedAccessTokenJsonObject.getLong("expiration_date")); longLivedAccessToken = new AccessToken(tokenCode, creationDate, expirationDate); } } if (jsonObject.has("id_token")) { JSONObject idTokenJsonObject = jsonObject.getJSONObject("id_token"); if (idTokenJsonObject.has("code") && idTokenJsonObject.has("creation_date") && idTokenJsonObject.has("expiration_date")) { String tokenCode = idTokenJsonObject.getString("code"); Date creationDate = new Date(idTokenJsonObject.getLong("creation_date")); Date expirationDate = new Date(idTokenJsonObject.getLong("expiration_date")); idToken = new IdToken(tokenCode, creationDate, expirationDate); } } return result; } }