active java azure azure-active-directory adal

java - active - Azure: no se puede usar RefreshToken para adquirir un nuevo AccessToken



azure active directory authentication (2)

ADAL utiliza los tokens de actualización almacenados de forma automática y transparente, no es necesario que realice ninguna acción explícita. AcquireTOkenByRefreshToken se encuentra en la superficie ADAL por razones heredadas, y se ha eliminado de la versión 3.x. Más información en http://www.cloudidentity.com/blog/2015/08/13/adal-3-didnt-return-refresh-tokens-for-5-months-and-nobody-noticed/

Estoy creando una aplicación que necesita acceso a las actividades de administración de Office 365 de nuestros clientes. He seguido los pasos descritos en esta descripción general de Azure Active Directory y puedo usar el código de OAuth para adquirir un token de acceso inicial, así como usar este token para configurar las suscripciones de O365.

Sin embargo, cuando uso el refresh_token proporcionado con mi token inicial para adquirir un nuevo token de acceso, refresh_token el siguiente error:

{"error_description": "AADSTS65001: El usuario o administrador no ha dado su consentimiento para usar la aplicación con el ID ''8f72f805-dfd2-428d-8b0e-771a98d26c16''. Envíe una solicitud de autorización interactiva para este usuario y este recurso. / r / nTrace ID: df229c3f-8f28-420b-9ac3-321ab1b2ad09 / r / nCorrelación ID: 0e0f2bcb-4b19-458a-8556-2a6d4e51379f / r / nTimestamp: 2016-10-03 17: 33: 20Z "" "invalid": ""

Como puedo adquirir y usar el token de acceso inicial, estoy bastante seguro de que el usuario está otorgando algunos permisos a mis aplicaciones. ¿Necesito un permiso específico para adquirir un token de acceso nuevo con el token de actualización?

Edición: Específicamente, estoy usando el paquete com.microsoft.azure::adal4j java , la clase AuthenticationContext, los métodos acquireTokenByAuthorizationCode y acquireTokenByRefreshToken :

public class AzureProvisioner { private final AuthenticationContext authService = new AuthenticationContext( "https://login.windows.net/common/oauth2/token", true, Executors.newSingleThreadExecutor()); private final ClientCredential clientCredential = new ClientCredential("azureAppId", "azureAppSecret"); public static final String resource = "https://manage.office.com"; // Internal implementation of REST interface; Microsoft didn''t provide a Java Library final Office365ManagementApi managementApi; public void acquireToken(final String authCode, final URI redirectUri) { final AuthenticationResult authResult = authService.acquireTokenByAuthorizationCode( authCode, redirectUri, clientCredential, resource, null).get() // internal library code, gets the "tid" field from parsing the JWT token final String tenantId = JwtAccessToken.fromToken(authResult.getAccessToken()).getTid(); // works createInitialSubscription(customerId, authResult.getAccessToken(), tenantId); // throws an error final AuthenticationResult refreshResult = authService.acquireTokenByRefreshToken( authResult.getRefreshToken(), clientCredential, null).get(); } private void createInitialSubscription(final String accessToken, final String tenantId) { final String authHeader = "Authorization: Bearer " + accessToken; final String contentType = "Audit.AzureActiveDirectory"; // internal implementation final CreateWebhookRequest requestBody = new CreateWebhookRequest(); managementApi.createSubscription(authHeader, tenantId, contentType, requestBody); } }

El mismo código, sin ninguna dependencia externa, tampoco funciona para mí:

public class AzureProvisioner { private final AuthenticationContext authService = new AuthenticationContext( "https://login.windows.net/common/oauth2/token", true, Executors.newSingleThreadExecutor()); private final ClientCredential clientCredential = new ClientCredential("8f72f805-dfd2-428d-8b0e-771a98d26c16", "secret"); public final String resource = "https://manage.office.com"; private URI redirectUri = new URI("https://localhost"); private static final String oAuthUrl = "https://login.windows.net/common/oauth2/authorize?response_type=code&client_id=8f72f805-dfd2-428d-8b0e-771a98d26c16&resource=https%3A%2F%2Fmanage.office.com&redirect_uri=https%3A%2F%2Flocalhost"; public AzureProvisioner() throws Exception { // do nothing } public static void main(String... args) throws Exception { final String authCode = "AQABAAAAAADRNYRQ3dhRSrm..."; new AzureProvisioner().acquireToken(authCode); } public void acquireToken(final String authCode) throws Exception { final AuthenticationResult authResult = authService.acquireTokenByAuthorizationCode( authCode, redirectUri, clientCredential, resource, null).get(); System.out.println(authResult.getAccessToken()); // throws an error final AuthenticationResult refreshResult = authService.acquireTokenByRefreshToken( authResult.getRefreshToken(), clientCredential, resource, null).get(); System.out.println(refreshResult.getAccessToken()); } }

Usando un proxy, tomé un rastro de la solicitud de actualización https:

Method: POST Protocol-Version: HTTP/1.1 Protocol: https Host: login.windows.net File: /common/oauth2/token Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive Content-Length: 876 refresh_token={token} &resource=https%3A%2F%2Fmanage.office.com &grant_type=refresh_token &scope=openid &client_secret={secret} &client_id=8f72f805-dfd2-428d-8b0e-771a98d26c16


Resulta que el problema de raíz fue con mis permisos de aplicación. En My Application > Settings > Required Permissions > Office 365 Management APIs , había seleccionado "Permisos de aplicación", donde tenía que seleccionar "Permisos delegados". Al intercambiarlos, mi código comenzó a funcionar inmediatamente como se esperaba.