5

Sto tentando di integrare l'API di Office365 tramite JavaScript con adal.js e jQuery (flusso implicito OAuth), ma sto riscontrando problemi nel tentativo di creare un evento di calendario per il mio utente . Il mio codice esistente funziona correttamente quando recupera le email e gli eventi del calendario, ma quando provo a creare un evento del calendario, ottengo costantemente una risposta "403 - Vietato".Autorizzazione negata (403) durante il tentativo di creare un evento di calendario

Il codice è attivo e funziona allo http://oauth.idippedut.dk/oauth.html. Sto accedendo all'endpoint dell'API di Office 365 allo https://outlook.office.com/api/v2.0/me/events.

La mia configurazione per "autorizzazioni delegate" sul App nei nostri Office365/Azure inquilino Active Directory è questo: enter image description here

La configurazione per "i permessi delle applicazioni" a l'applicazione nel nostro Office365/Azure inquilino Active Directory è questo: enter image description here

La richiesta jQuery è questo:

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 configurazione di jQuery è questa:

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' 
}); 

e la conseguente HTTP-request è questo:

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"}]} 

Sono davvero perplesso sul motivo per cui ho la 403, dal momento che tutto dovrebbe essere impostato correttamente.

Qualsiasi aiuto sarà molto apprezzato :-)

/Jesper

+0

Mi è sembrato un po 'più vicino al riferimento dell'API e ho modificato la configurazione della "risorsa" in https://outlook.office.com/Calendars.ReadWrite, e ora il codice restituisce un errore come questo: "Errore ADAL: AADSTS50001 : L'applicazione denominata https://outlook.office.com/Calendars.ReadWrite non è stata trovata nel tenant denominato 365projectum.onmicrosoft.com. Ciò può accadere se l'applicazione non è stata installata dall'amministratore dell'inquilino o accettata da qualsiasi utente nel tenant. Potresti aver inviato la tua richiesta di autenticazione all'inquilino sbagliato. ". Quindi questo non mi ha portato da nessuna parte :-( –

+2

Ha sicuramente qualcosa da fare con il token. Microsoft continua ad aggiornare/aggiornare le proprie API. A causa di questo, dovresti prendere in considerazione l'utilizzo dell'endpoint grafico. – bloC

risposta

2

Si è configurato autorizzazioni delegate per Microsoft Graph, ma chiamare l'endpoint di Outlook. È necessario eseguire una delle seguenti operazioni: 1. modificare la configurazione dell'app per disporre delle autorizzazioni delegate per Outlook/Office 365 Exchange Online. 2. cambia l'app per utilizzare l'endpoint Microsoft Graph (graph.microsoft.com), ovvero https://graph.microsoft.com/v1.0/me/events e mantieni la configurazione corrente dell'app.

0

Inizialmente hai registrato l'applicazione che richiede l'autorizzazione "Leggi utente e calendari condivisi" e successivamente aggiungi l'autorizzazione "Avere accesso completo ai calendari utente"? In caso affermativo, potresti trovarti nella situazione in cui gli utenti hanno acconsentito alla precedente autorizzazione e dal momento che tale consenso è in atto non viene mai chiesto ulteriormente di accettare la nuova autorizzazione che hai aggiunto. Questo spiegherebbe perché la tua app può leggere, ma non può scrivere.

Sarai in questa situazione solo con gli utenti che hanno acconsentito PRIMA di aver aggiunto la nuova autorizzazione e solo se gli utenti hanno effettivamente acconsentito. Gli utenti non dovrebbero acconsentire se si è registrata l'app come amministratore e si è effettuato l'accesso con utenti nello stesso titolare come amministratore. Gli utenti DEVONO acconsentire se l'app è stata registrata come utente ordinario o se l'app è un'app multi-tenant.

Se uno dei due è il caso, il modo più semplice per vedere se questo è il problema è provare a utilizzare l'app come un utente nuovo di zecca che non ha acconsentito prima. Questo nuovo utente acconsentirebbe a tutte le autorizzazioni richieste dall'app. Nota che se si tratta di un'app di autorizzazione amministratore, avrai bisogno di un nuovo tenant netto per consentire.

Se questo risolve il problema, è necessario consentire agli utenti esistenti di eseguire un passaggio in cui si invia una nuova richiesta di autorizzazione OAuth utilizzando il parametro prompt = consentita, per ottenere nuovamente il consenso.