5

J'essaie d'intégrer l'API Office365 via JavaScript avec adal.js et jQuery (flux implicite OAuth), mais j'ai des problèmes pour créer un événement de calendrier pour mon utilisateur . Mon code existant fonctionne correctement lorsque récupère des e-mails et des événements de calendrier, mais lorsque j'essaie de créer un événement de calendrier, je reçois systématiquement une réponse "403 - Interdit".Autorisation refusée (403) lors de la création d'un événement de calendrier

Le code est en ligne et fonctionne à http://oauth.idippedut.dk/oauth.html. J'accède au point de terminaison de l'API Office 365 au https://outlook.office.com/api/v2.0/me/events.

Ma configuration pour "autorisations Delegated" sur l'application dans notre Office365/locataire Azure Active Directory est la suivante: enter image description here

La configuration des "autorisations d'application" sur l'application dans notre locataire Office365/Azure Active Directory est ceci: enter image description here

La demande jQuery est la suivante:

var event = { 
    "Subject": "Discuss the Calendar REST API", 
    "Body": { 
     "ContentType": "HTML", 
     "Content": "I think it will meet our requirements!" 
    }, 
    "Start": { 
     "DateTime": "2016-01-21T18:00:00", 
     "TimeZone": "Pacific Standard Time" 
    }, 
    "End": { 
     "DateTime": "2016-01-21T19:00:00", 
     "TimeZone": "Pacific Standard Time" 
    }, 
    "Attendees": [ 
     { 
      "EmailAddress": { 
       "Address": "[email protected]", 
       "Name": "Janet Schorr" 
      }, 
      "Type": "Required" 
     } 
    ] 
}; 

// Create calendar events 
jQuery.ajax({ 
    type: 'POST', 
    url: postCalenderEndpoint, 
    data: JSON.stringify(event), 
    contentType: "application/json", 
    headers: { 
     'Accept': 'application/json', 
     'Authorization': 'Bearer ' + token, 
    }, 

}).done(function (data) { 
    //alert(JSON.stringify(data)); 
}).fail(function (err) { 
    jQuery("#loginMessage").text('Error calling REST endpoint: ' + err.statusText + '\n' + err.responseText); 
}); 

La configuration de jQuery est la suivante:

var resource = 'https://outlook.office.com'; 
var postCalenderEndpoint = 'https://outlook.office.com/api/v2.0/me/events'; 
var clientID = '28a707a5-0f11-4d93-8b88-6a918544da14'; 
var tenantName = '365projectum.onmicrosoft.com'; 
var authContext = new AuthenticationContext({ 
    instance: 'https://login.microsoftonline.com/', 
    tenant: tenantName, 
    clientId: clientID, 
    postLogoutRedirectUri: window.location.origin, 
    cacheLocation: 'localStorage' 
}); 

Et le HTTP demande qui en résulte est la suivante:

Host: outlook.office.com 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0 
Accept: application/json 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Content-Type: application/json; charset=UTF-8 
Authorization: Bearer <my token> 
Referer: http://oauth.idippedut.dk/oauth.html 
Content-Length: 386 
Origin: http://oauth.idippedut.dk 
Connection: keep-alive 

{"Subject":"Discuss the Calendar REST API","Body":{"ContentType":"HTML","Content":"I think it will meet our requirements!"},"Start":{"DateTime":"2016-01-21T18:00:00","TimeZone":"Pacific Standard Time"},"End":{"DateTime":"2016-01-21T19:00:00","TimeZone":"Pacific Standard Time"},"Attendees":[{"EmailAddress":{"Address":"[email protected]","Name":"Janet Schorr"},"Type":"Required"}]} 

Je suis vraiment perplexe pourquoi je reçois le 403, puisque tout doit être mis en place correctement.

Toute aide sera grandement appréciée :-)

/Jesper

+0

J'ai regardé un peu plus près à la référence de l'API et changé la configuration de "ressource" à https://outlook.office.com/Calendars.ReadWrite, et maintenant le code renvoie une erreur comme ceci: "Erreur ADAL s'est produite: AADSTS50001 : L'application nommée https://outlook.office.com/Calendars.ReadWrite est introuvable dans le locataire nommé 365projectum.onmicrosoft.com Cela peut se produire si l'application n'a pas été installée par l'administrateur du locataire ou si elle a été acceptée par n'importe quel utilisateur du locataire Vous avez peut-être envoyé votre demande d'authentification au mauvais locataire. ". Donc ça ne m'a pas du tout :-( –

+2

) Il faut absolument que quelque chose fonctionne avec le jeton: Microsoft continue à mettre à jour/à mettre à jour ses APIs.Pour ce fait, vous devriez peut-être envisager d'utiliser le point final du graphe. – bloC

Répondre

2

Vous avez configuré les autorisations déléguées pour Microsoft Graph, mais appelez le point de terminaison Outlook. Vous devez effectuer l'une des opérations suivantes: 1. modifiez la configuration de votre application pour disposer des autorisations déléguées pour Outlook/Office 365 Exchange Online. 2. modifiez votre application pour utiliser le point de terminaison Microsoft Graph (graph.microsoft.com), c'est-à-dire https://graph.microsoft.com/v1.0/me/events et conservez la configuration actuelle de l'application.

0

Avez-vous enregistré l'application demandant l'autorisation "Lire l'utilisateur et les agendas partagés", puis ajoutez l'autorisation "Avoir accès aux calendriers utilisateur"? Si oui, vous pourriez être dans la situation où les utilisateurs ont consenti à la permission précédente, et puisque ce consentement est en place, ils ne sont plus demandés de consentir à la nouvelle permission que vous avez ajoutée. Ce qui expliquerait pourquoi votre application peut lire, mais ne peut pas écrire.

Vous ne seriez dans cette situation que si les utilisateurs avaient consenti AVANT d'ajouter la nouvelle autorisation, et uniquement si les utilisateurs y consentaient. Les utilisateurs n'auraient pas à donner leur accord si vous avez enregistré l'application en tant qu'administrateur et si vous vous connectez avec des utilisateurs du même locataire que l'administrateur. Les utilisateurs DEVRAIENT consentir si vous avez enregistré l'application en tant qu'utilisateur ordinaire, ou si l'application est une application multi-locataire.

Si l'un des deux est le cas, le moyen simple de voir si c'est le problème est d'essayer d'utiliser l'application comme un nouvel utilisateur qui n'a pas consenti auparavant. Ce nouvel utilisateur accepterait toutes les autorisations demandées par l'application. Notez que s'il s'agit d'une application admin-consent, vous aurez besoin d'un nouveau locataire net pour y consentir. Si cela résout le problème, vous devez faire en sorte que vos utilisateurs existants passent par une étape où vous envoyez une nouvelle demande d'autorisation OAuth en utilisant le paramètre prompt = consent, pour les obtenir à nouveau.