diff --git a/src/main/java/com/microsoft/azure/datalake/store/oauth2/AzureADAuthenticator.java b/src/main/java/com/microsoft/azure/datalake/store/oauth2/AzureADAuthenticator.java index 1411a88..cf1de7e 100644 --- a/src/main/java/com/microsoft/azure/datalake/store/oauth2/AzureADAuthenticator.java +++ b/src/main/java/com/microsoft/azure/datalake/store/oauth2/AzureADAuthenticator.java @@ -112,6 +112,28 @@ public static AzureADToken getTokenUsingRefreshToken(String clientId, String ref return getTokenCall(authEndpoint, qp.serialize()); } + /** + * gets Azure Active Directory token using refresh token + * + * @param authEndpoint the OAuth 2.0 token endpoint associated with the user's directory + * (obtain from Active Directory configuration) + * @param clientId the client ID (GUID) of the client web app obtained from Azure Active Directory configuration + * @param refreshToken the refresh token + * @return {@link AzureADToken} obtained using the refresh token + * @throws IOException throws IOException if there is a failure in connecting to Azure AD + */ + public static AzureADToken getTokenUsingRefreshToken(String authEndpoint, String clientId, String refreshToken) + throws IOException + { + QueryParams qp = new QueryParams(); + qp.add("grant_type", "refresh_token"); + qp.add("refresh_token", refreshToken); + if (clientId != null) qp.add("client_id", clientId); + log.debug("AADToken: starting to fetch token using refresh token for client ID " + clientId ); + + return getTokenCall(authEndpoint, qp.serialize()); + } + /** * gets Azure Active Directory token using the user's username and password. This only * works if the identity can be authenticated directly by microsoftonline.com. It will likely diff --git a/src/main/java/com/microsoft/azure/datalake/store/oauth2/RefreshTokenBasedTokenProvider.java b/src/main/java/com/microsoft/azure/datalake/store/oauth2/RefreshTokenBasedTokenProvider.java index 06e6077..ff0af01 100644 --- a/src/main/java/com/microsoft/azure/datalake/store/oauth2/RefreshTokenBasedTokenProvider.java +++ b/src/main/java/com/microsoft/azure/datalake/store/oauth2/RefreshTokenBasedTokenProvider.java @@ -17,7 +17,7 @@ public class RefreshTokenBasedTokenProvider extends AccessTokenProvider { private static final Logger log = LoggerFactory.getLogger("com.microsoft.azure.datalake.store.oauth2.RefreshTokenBasedTokenProvider"); - private final String clientId, refreshToken; + private final String authEndpoint, clientId, refreshToken; /** * constructs a token provider based on the refresh token provided @@ -25,6 +25,7 @@ public class RefreshTokenBasedTokenProvider extends AccessTokenProvider { * @param refreshToken the refresh token */ public RefreshTokenBasedTokenProvider(String refreshToken) { + this.authEndpoint = null; this.clientId = null; this.refreshToken = refreshToken; } @@ -36,6 +37,7 @@ public RefreshTokenBasedTokenProvider(String refreshToken) { * @param refreshToken the refresh token */ public RefreshTokenBasedTokenProvider(String clientId, String refreshToken) { + this.authEndpoint = null; this.clientId = clientId; this.refreshToken = refreshToken; } @@ -47,6 +49,7 @@ public RefreshTokenBasedTokenProvider(String clientId, String refreshToken) { * @param refreshToken the refresh token */ public RefreshTokenBasedTokenProvider(String clientId, RefreshTokenInfo refreshToken) { + this.authEndpoint = null; this.clientId = clientId; this.refreshToken = refreshToken.refreshToken; if (refreshToken.accessToken != null && @@ -58,9 +61,25 @@ public RefreshTokenBasedTokenProvider(String clientId, RefreshTokenInfo refreshT } } + /** + * constructs a token provider based on the refresh token provided + * + * @param authEndpoint the OAuth 2.0 token endpoint associated with the user's directory + * (obtain from Active Directory configuration) + * @param clientId the client ID (GUID) of the client web app obtained from Azure Active Directory configuration + * @param refreshToken the refresh token + */ + public RefreshTokenBasedTokenProvider(String authEndpoint, String clientId, String refreshToken) { + this.authEndpoint = authEndpoint; + this.clientId = clientId; + this.refreshToken = refreshToken; + } + @Override protected AzureADToken refreshToken() throws IOException { log.debug("AADToken: refreshing refresh-token based token"); - return AzureADAuthenticator.getTokenUsingRefreshToken(clientId, refreshToken); + if (authEndpoint == null) + return AzureADAuthenticator.getTokenUsingRefreshToken(clientId, refreshToken); + return AzureADAuthenticator.getTokenUsingRefreshToken(authEndpoint, clientId, refreshToken); } }